フィルターのクリア

finding value in 2d array function of x and y

5 ビュー (過去 30 日間)
Andreea Postariu
Andreea Postariu 2024 年 6 月 10 日
編集済み: Torsten 2024 年 6 月 10 日
Hi all, I realise this may be the first time I ask a question even though I've been using the forum for 12 years. Kudos to you for asking every question and answering everything that ever crossed my mind. Here's my question:
Input data:
  • I have two vectors, Torque effmap.chainTQ and Speed effmap.chainRPM. They are two columns 1x100 elements
  • There is also a 2D array, much like below. For every (Torque,Speed) pair, there is a corresponding Efficiency value effmap.chainRPM
Processing:
  • I have a new pair of vectors, say vehicle.wheeltorque and vehicle.wheelspeed which are 1x1000. They represent a duty cycle, which the vehicle is going thru.
  • For every set of (vehicle.wheeltorque ,vehicle.wheelspeed) I need the code to find the closest value of Efficiency. I can't figure this one out. I suppose it should be a double for loop of sorts and I found array indexing might be needed, but so far I couldn't get it to work.
Example efficiency map:
What I tried, and works, is to take the base efficiency map, use interp2 and meshrid to refine it, and for a given single set of (testspeed,testtq) I can extract the Efficiency value - see the "point" value:
effmap.chainRPM = xlsread ('03b_DummychainLossmap','Chain', 'B3:B23')
effmap.chainTQ = xlsread ('03b_DummychainLossmap','Chain', 'C2:W2')
effmap.chainLoss = xlsread ('03b_DummychainLossmap','Chain', 'C3:W23')
surf(effmap.chainRPM,effmap.chainTQ,effmap.chainLoss)
[MeshX,MeshY] = meshgrid(0:10:2000,0:10:2000) %mesh to create more points in a map/array
MeshQ = interp2(effmap.chainRPM,effmap.chainTQ,effmap.chainLoss,MeshX,MeshY,'spline');
surf(MeshX,MeshY,MeshQ)
testspeed = 200
testtq = 1000
point = interp2(MeshX,MeshY,MeshQ,testtq,testspeed) %so now I know it works
However, it doesn't work for a full vector of torque and speed :
linear_indices = sub2ind(MeshQ, MeshY(1,:), MeshX(1,:))
logical_indices = (MeshQ(:, 1) == MeshX & MeshQ(:, 2) == MeshY)
extracted_values = MeshQ(logical_indices, :)
for vehicle.wheeltorque(1:) to vehicle.wheeltorque(1:size(vehicle.wheeltorque))
....................
I tried it in many ways, but fundamentally I don't understand what the logic of the code should be. Help? Last thing, it needs to store the efficiency values in a vector for further analysis.
Cheers, ask if not clear

回答 (1 件)

Torsten
Torsten 2024 年 6 月 10 日
編集済み: Torsten 2024 年 6 月 10 日
Given (vehicle.wheeltorque ,vehicle.wheelspeed), use pdist2 to compute the distances to the column vectors of the matrix [Torque effmap.chainTQ ;Speed effmap.chainRPM ].
Get the index idx where the distance is minimal and assign effmap.chainRPM(idx) as efficiency to (vehicle.wheeltorque ,vehicle.wheelspeed).
This is some kind of "nearest neighbour" interpolation.
You could also try "scatteredInterpolant"
but I'd suggest starting with the simplest method described above.

製品


リリース

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by