【问题标题】:Convert for loop into vector expression将 for 循环转换为向量表达式
【发布时间】:2017-07-19 23:16:22
【问题描述】:

我是 MATLAB 新手,正在学习使用向量表达式而不是冗长的 for 循环。我有一个 sn-p,我想知道它是否可以写成简洁的向量,如果可以,我将如何修改它。

for v = I
    X(i, v) = X(i, v) + length(I(I == v));
end

X 是 1500x200

I 是 3763x1

i 可以认为是一个常数

我在这里做的是这个。 I 包含X 的列索引,我想将这些位置增加特定索引在I 中出现的次数。所以在这个 for 循环完成后,X 的第 i 行将包含一个直方图。

任何其他改进我的 MATLAB 编码的想法或建议也将不胜感激。

【问题讨论】:

  • 有一个函数可以用来做你所追求的。看看accumarray。 (另外,您的代码似乎有逻辑错误;为什么您要遍历 I ,然后每次再次遇到元素时重复 I 中重复的次数?)
  • 是的,我也注意到了这个错误,现在正在修复它。我会查看您提到的功能并回复您。

标签: matlab vectorization date-histogram


【解决方案1】:

这里有几种方法:

I = randi(10, [50,1]);  

X = zeros (1, 10);
for Col = 1 : size (X, 2)
  X(1, Col) = sum (I == Col);
end
% X = 7   7   3   3   7   4   5   8   1   5

X = zeros (1, 10);
for Col = I.'   % the transpose operation is needed to convert to horizontal!
  X(1, Col) += 1;
end
% X = 7   7   3   3   7   4   5   8   1   5

X = zeros (1, 10);
X = accumarray (I, ones (size (I)), size (X))
% X = 7   7   3   3   7   4   5   8   1   5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2012-08-10
    • 2013-03-05
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多