【问题标题】:Matlab 2D-array indexing contradiction between for loop and vectorised versionfor循环和向量化版本之间的Matlab 2D-array索引矛盾
【发布时间】:2015-07-06 15:18:30
【问题描述】:

我知道这里有很多索引问题,但这个问题让我感到困惑,希望有人能快速回答我,如果这个问题被删除,我会理解。我有一个 2D a-by-b 数组 x 并想从另一个数组 y 中得到这个:

for i=1:b        
x(:,i) = y( (i-1) * k+1 : (i-1) * k+a )
end

没有for循环,像这样:

x(:,1:b) = y( (0:b-1) * k+1 : (0:b-1) * k+a )

但无济于事,我得到了

“下标分配维度不匹配。”

有什么想法吗?提前谢谢你。

【问题讨论】:

  • k对应什么?
  • 它可以是任何合适的值,比如一个正整数,例如 2

标签: matlab for-loop indexing vectorization


【解决方案1】:

看来您可以使用 bsxfun 创建这些线性索引并索引到 y 以获得所需的输出,如下所示 -

x = y(bsxfun(@plus,[1:a]',[0:b-1]*k))

【讨论】:

  • 谢谢。如果我想将一个元素与另一个长度为 a 的向量相乘怎么办?我可以将它集成到 bsfxfun 中吗?
  • @user3374479 bsxfun(@times,x,another_vector(:))?
【解决方案2】:

你不能只是在矢量化中翻译 for 循环

当你这样做时

vector : n

其实MATLAB做的

vector(1):n

这就是你的矢量化错误的地方。

【讨论】:

  • 抱歉,我没听懂,你在哪里看到我这样做?
  • @user3374479 by vector 他的意思是(0:b-1)
  • 我应该如何继续?
【解决方案3】:

b=10,假设'a'可以是一个标量,(k*a) = 3;

x(:,1:10) = y( (0:10-1) * 3 : (0:10-1) * 3);

无论 'y' 等于什么,等式的右边都是一个标量,并且由于您没有循环遍历,您只需将 'x' 的前 10 个值替换为相同的数字:

例如,x(:,1:10) = 116 116 116 116 116 116 116 116 116 116

没有循环就不能迭代索引

【讨论】:

  • 感谢您的解释,@Divakar 的 bsxfun 行成功了 :)
猜你喜欢
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2012-04-05
相关资源
最近更新 更多