2011-05-05 143 views
14

我正在写一个MATLAB函数来读出数据到一个n维数组(可变维度大小)。我需要能够访问矩阵中的特定点(例如,写入或读取它),但我不知道需要指定多少个索引。使用向量作为矩阵的索引

目前我有一个current_point矢量,我遍历指定每个索引,并指定数组的大小的max_points矢量。所以,如果例如,我想大小1000逐15×3,max_points = [1000 15 3]的3维阵列,并且从[1, 1, 1]current_point迭代到[1000, 15, 3][1, 1, 1] - >[1000, 1, 1] - >[1, 2, 1] - >[1000, 2, 1] - > ...) 。我希望能够做的是饲料current_point作为索引矩阵,像这样:

output_matrix(current_point) = val 

但很显然,像output_matrix([1 2 3]) = val将只设置outputmatrix(1:3) = 30。我不能只是使用虚拟变量,因为有时矩阵需要3个索引,其他时间4,其他时间2等,所以一个可变长度的向量真的是我需要的。有一种简单的方法可以将矢量用作索引中的点吗?

+0

这是*本质* [紧凑MATLAB矩阵索引符号(的副本http://stackoverflow.com/questions这只适用/ 792683/compact-matlab-matrix-indexing-notation),尽管也许这个问题比这种情况要简单一些。 – gnovice 2011-05-05 21:59:41

+0

我知道这一定是以前被问过的,但是无法用我的dupe插件找到它。我想我会让答案保持不变,因为问题标题比另一个更直接,可能更容易搜索。 – abcd 2011-05-05 22:11:30

+0

我认为它在某些时候一定被问过了,但从标题中我什么都看不到。来自你们两个的好答案。我认为会有这样简单的事情。 – Paul 2011-05-05 23:37:12

回答

17

使用函数sub2ind创建linear index是此问题的典型解决方案,如此closely-related question中所示。您也可以拨打compute a linear index yourself而不是拨打sub2ind

但是,您的情况可能比我链接到的其他问题更简单。如果您只使用您的current_point向量(即,向您指定单个点)。它只是n维矩阵中的一个n元素下标向量),那么您可以使用一个简单的解决方案,使用函数num2cellcurrent_point转换为下标单元阵列,并使用它来创建索引的comma-separated list。例如:

current_point = [1 2 3 ...];  % A 1-by-n array of subscripts 
subCell = num2cell(current_point); % A 1-by-n cell array of subscripts 
output_matrix(subCell{:}) = val; % Update the matrix point 

操作subCell{:}创建打字subCell{1}, subCell{2}, ...,其是键入current_point(1), current_point(2), ...的等效的等效。

3

您可以使用sub2ind函数从下标中获取线性索引。

实施例:

A=magic(4) 

A = 

    16  2  3 13 
    5 11 10  8 
    9  7  6 12 
    4 14 15  1 

selectElement={2,3}; %# get the element at position 2,3 in A. 
indx=sub2ind(size(A),selectElement{:}); 
A(indx) 

ans = 

    10 

在上面的例子中,我所存储的下标(可以是任何数量的维度),为cell。如果您将它存储为矢量,只需使用num2cell()将其转换为单元格即可。

您现在可以轻松地将此值指定为A(indx)=value;。我使用了不同于你的变量来保持答案的一般性,但这个想法是一样的,你只需要替换变量名。

你也在你的帖子中提到你正在从(1,1,1)循环到某个值,(1000,15,3)并为这些点中的每一个赋值。如果您沿着列循环,则可以用矢量化解决方案替换整个操作。

finalElement={1000,15,3}成为循环的最后一步。和以前一样,找到线性指数

index=sub2ind(size(A),finalElement{:}); 

现在,如果你有你在存储为单个矢量,values循环分配值,你可以简单地给它分配在一个单一的步骤为

A(1:index)=values; 
10

我知道这太晚了,但任何人都会发现这个话题。对我来说最简单的方法是使用:diag(A (x(:),y(:)));

不幸的是,如果你需要从矩阵得到的值,不改变值

+2

你可以进一步解释这一点,我不明白它,但它看起来可能是一个不错的和简单的解决方案 – Leo 2014-02-24 10:42:49

+0

真棒...作品完美! +1 – bluebox 2015-11-06 20:08:14