Using vector to access multidimensional array or passing vector as multiple inputs
1 次查看(过去 30 天)
显示 更早的评论
Hello,
I would like to access multidimensional array using vector like:
n=2
arraySizes=[n*ones(1,2),3*ones(1,3)]
A=ones(arraySizes)
ind=[3,2,1,1,2]
A(ind) % I would like it, if output was a scalar.
or to convert that vector of indices to linear indice:
indN= sub2ind(arraySizes,ind)
A(indN)
I know that it is possible to use cell and {:}, but num2cell and mat2cell aren't supported in MEX creation, so it's also not a solution I look for (and for loop copying num array to cell is very slow).
indCell=num2cell(ind)
indN= sub2ind(arraySizes,indCell{:})
A(indN)
I don't want just use hard indexing, because n isn't constant, and switch case with hundreds hard coded options doesn't seem optimal (but maybe it would be the fastest method then I will).
A(ind(1),ind(2),ind(3),ind(4),ind(5))
My current solution is showed below, but I`m looking for faster approch.
indNum=(ind-ones(1,length(arraySizes)))*((cumprod(arraySizes))./arraySizes).'+1
A(indNum)
Thank you for your time,
Matt
2 个评论
Rik
2022-6-17
How is ind created? It might be easier to make sure it is a cell from the start. Then you can use A(ind{:}).
回答(1 个)
Chetan
2024-1-5
I understand you're looking to access elements in a multidimensional array for MEX file creation without using `num2cell` or `mat2cell`. Your current method of converting subscript indices to a linear index is correct and efficient for this purpose.
Here's a concise way to calculate the linear index:
n = 2;
arraySizes = [n*ones(1,2), 3*ones(1,3)];
A = ones(arraySizes);
ind = [3, 2, 1, 1, 2];
% Calculate cumulative product of array sizes
cumprodSizes = [1, cumprod(arraySizes(1:end-1))];
% Compute linear index and access the element
linearIndex = sum((ind - 1) .* cumprodSizes) + 1;
elementValue = A(linearIndex);
This code calculates the linear index by considering the array's dimensions and then accesses the element directly. It's a MEX-friendly approach and scales with different array dimensions.
Make sure the subscript indices in `ind` are valid for the array's size before indexing.
For more information about array indexing and linear indexing in MATLAB, you might find these resources helpful:
- Array Indexing: https://www.mathworks.com/help/matlab/math/array-indexing.html
- Linear Indexing: https://www.mathworks.com/help/matlab/math/matrix-indexing.html
Hope it helps
Best regards,
Chetan Verma
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!