matlab数组索引与向量与矩阵不一致?

时间:2014-05-27 13:28:38

标签: arrays matlab matrix indexing

以下问题令我头疼:

我正在使用矩阵索引尺寸为Nx1的矢量R,即:

R = ones( [ N nSteps ] );
R = (:);

带有指标矩阵。基本上,矩阵的每一行都是一行标记,我需要存储在R中的值,这是R中的向量具有离开R中当前点的不同偏移量。矩阵看起来像是:

k = 0:nSteps;
I = repmat( k , [size(D,2) 1])
I = bsxfun(@minus, I , D');
% later in code, this is used as:
currI = currPoint + currI;
% this is used for indexing just a little later
... R(currI) ...

这个例子中的D是一个存储我想要的不同偏移量的数组。它在大多数情况下都能很好地工作,并且由于我可以使用索引,因此给出了维度[size(D,2)nSteps]的数组。

这是问题开始的地方:偏移量作为参数传递给函数,并且可以变化。每当我尝试使用一个简单的偏移量时,例如400,我就会遇到问题。如果某个东西被1xN或Nx1向量索引并且总是返回一个尺寸为[nSteps 1]而不是[1 nSteps]的向量,那么Matlab似乎并不关心。结果然后用于调用bsxfun,该函数的结果不再是[size(D,2)nSteps]的矩阵,而是[nSteps nSteps]矩阵,我无法做任何事情并且也是在算法的上下文中定义。

TLDR:在索引R(1:400)而不是N x 1数组时,我可以让matlab给我一个1 x N数组吗?我可以强制与矩阵索引一致吗?

2 个答案:

答案 0 :(得分:1)

我可能不完全确定你的意思,但我可以在matlab中解释一些关于向量的内容。我认为您的问题与未正确指定尺寸有关。

初始化为vec(1:anyNbr) = someNbr % or vector of same size的向量始终是行向量。要使其成为列向量,您可以执行vec(1:anyNbr,1) = someNbr

运算符(:)重新排列指向向量中每个元素的指针,从而创建列向量。这也意味着矩阵成为列向量。该操作比reshape(vec,numel(vec),1)更快。

matlab向量中的元素按列索引,这意味着

r = [1,4,7;2,5,8;3,6,9];
r(:)

给出了列向量[1;2;3;4;5;6;7;8;9]

但是,将变量定义为vec = something会使vecsomething完全相同。此外,如果变量已初始化,则分配vec(1:anyNbr) = something会将something分配给vec定义的维。因此,如果vec是列向量,则它将保留就这样。

因此,在定义向量和矩阵时要考虑的是,有时必须在初始化时指定维度。您可能已经意识到这一点,但我并不完全知道您的问题是什么,所以如果我提供太多信息,我很抱歉。

答案 1 :(得分:0)

我理解的问题(以及我自己的代码也有问题)可以这样显示:

Data1 = rand(1,12);
Data2 = rand(3,4);
Data3 = rand(12,1);
Index1 = reshape(1:12,[12,1]);
Index2 = reshape(1:12,[6,2]);
Index3 = reshape(1:12,[3,4]);
Index4 = reshape(1:12,[2,6]);
Index5 = reshape(1:12,[1,12]);
[size(Data1(Index1)),size(Data2(Index1)),size(Data3(Index1));
size(Data1(Index2)),size(Data2(Index2)),size(Data3(Index2));
size(Data1(Index3)),size(Data2(Index3)),size(Data3(Index3));
size(Data1(Index4)),size(Data2(Index4)),size(Data3(Index4));
size(Data1(Index5)),size(Data2(Index5)),size(Data3(Index5))]

matlab(我认为是设计)给出了那些不一致的结果(这里用粗体值标记)

ans =

     1    12    12     1    12     1
     6     2     6     2     6     2
     3     4     3     4     3     4
     2     6     2     6     2     6
     1    12     1    12    12     1

在我自己的代码中调试了一些更微妙的错误后,我来到这里。在我看来,没有其他人给出了足够的答案,我将介绍我丑陋的解决方法:

ConsistentResult = reshape(Data(Index),size(Index)));

现在测试如下:

[size(reshape(Data1(Index1),size(Index1))),size(reshape(Data2(Index1),size(Index1))),size(reshape(Data3(Index1),size(Index1)));
size(reshape(Data1(Index2),size(Index2))),size(reshape(Data2(Index2),size(Index2))),size(reshape(Data3(Index2),size(Index2)));
size(reshape(Data1(Index3),size(Index3))),size(reshape(Data2(Index3),size(Index3))),size(reshape(Data3(Index3),size(Index3)));
size(reshape(Data1(Index4),size(Index4))),size(reshape(Data2(Index4),size(Index4))),size(reshape(Data3(Index4),size(Index4)));
size(reshape(Data1(Index5),size(Index5))),size(reshape(Data2(Index5),size(Index5))),size(reshape(Data3(Index5),size(Index5)]

会给出这个:

ans =

    12     1    12     1    12     1
     6     2     6     2     6     2
     3     4     3     4     3     4
     2     6     2     6     2     6
     1    12     1    12     1    12