开发者

Variable-Length Array Addressing in Matlab

开发者 https://www.devze.com 2023-02-19 14:51 出处:网络
I\'m sure there\'s an easy answer to this, but I\'m not really sure what to search for. I have an array, M, of D dimensions, where D is constrained to be 1 <= D <= 5, and a vector of length D, X

I'm sure there's an easy answer to this, but I'm not really sure what to search for. I have an array, M, of D dimensions, where D is constrained to be 1 <= D <= 5, and a vector of length D, X. I'd like to use D as an开发者_StackOverflow address within M and increment the value at that address, so if D were [1 2 3], I would want to increment M(1,2,3). I know I can do it like so:

if D == 1
  M(X(1)) = M(X(1)) + 1;
end

if D == 2
  M(X(1), X(2)) = M(X(1), X(2)) + 1;
end

But it's really ugly and I have to imagine there's a simpler, less clumsy way. Thanks!


You can use the function sub2ind to convert the address vector D to the corresponding dimensions in M. However, this would require that you store D as a cell and not a vector. The following example should help.

A=magic(5);%# just a test matrix

A=
17    24     1     8    15
23     5     7    14    16
 4     6    13    20    22
10    12    19    21     3
11    18    25     2     9

d={3,4};%we need the element at row 3, column 4
indx=sub2ind(size(A),d{:});%# get the index corresponding to the subscript 3,4

A(indx)

ans=
20

You can also directly index it into the matrix A as A(sub2ind(size(A),d{:})), without having to create a separate variable.

You can also use num2cell to convert the vector to a cell. This might be a better option, as you might want to store D as a vector for other purposes. So the corresponding line becomes

indx=sub2ind(size(A),num2cell(d));
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号