【问题标题】:matlab array indexing with vector vs. matrix inconsistent?matlab数组索引与向量与矩阵不一致?
【发布时间】:2014-05-27 13:28:38
【问题描述】:

以下问题让我很头疼:

我正在用矩阵索引一个维度为 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,我都会遇到问题。 Matlab 似乎并不关心某些东西是否被 1xN 或 Nx1 向量索引并且总是返回,在这种情况下,向量的维度为 [nSteps 1] 而不是 [1 nSteps]。由于结果随后用于调用 bsxfun,因此该函数的结果不再是 [size(D,2) nSteps] 的矩阵,而是 [nSteps nSteps] 矩阵,我对此无能为力,而且也很糟糕——在算法的上下文中定义。

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

【问题讨论】:

  • 我不完全确定我是否理解了你的问题,但是如果你将一个变量初始化为 a(1:10) = one(10,1) 但是你得到一个行向量的问题是那 R(:) 总是给出一个列向量?
  • 问题是,在一般情况下,我用一个矩阵索引 R,例如一个 5x400 矩阵,这给了我一个 5x400 矩阵作为回报。 R 是目前类似于 16000000x1 的向量。现在,有时,我索引的矩阵实际上只是一个 1x400 矩阵。这导致我得到一个 400x1 矢量而不是我需要的 1x400。由于我希望在一种情况下处理所有事情,我不能简单地转置该向量,它会影响其他解决方案。也许我应该把它放在首位:x
  • 更具体地说明为什么不能简单地转置结果。这似乎是要走的路。
  • 结果稍后使用,尺寸很重要,因为我在 bsxfun 中使用它。但是根据我传递的参数,我得到了两种不同的维度,我真的不想要那个。
  • 或:1 次,D 是一个偏移量数组,我创建一个矩阵来索引该 R 数组,我得到一个矩阵,它是 D 倍的元素数,无论我的原始索引向量有多长.然而,下一次,D 只是一个数字,或者一个 1x1 向量,现在我得到一个矩阵,它是第一维索引向量的大小,第二维是 1,而不是相反,这就是发生在第一种情况下。这让我很生气。

标签: arrays matlab matrix indexing


【解决方案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 是列向量,它将保持原样。

因此,在定义向量和矩阵时要考虑的是,有时必须在初始化时指定维度。您可能知道其中的大部分内容,但我不完全知道您的问题是什么,所以如果我提供太多信息,我很抱歉。

【讨论】:

    【解决方案2】:

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

    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(我认为是设计使然)给出了不一致的结果(这里用粗体标记)

    答案= 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)]
    

    会给这个:

    答案= 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      相关资源
      最近更新 更多