【问题标题】:Array from vector on the basis of a second array基于第二个数组的向量数组
【发布时间】:2013-09-30 17:01:05
【问题描述】:

我有一个向量v。我需要形成一个数组a,其中包含根据另一个数组b 指定的元素。 a 中的每一行(我们用r 表示)应包含v 中的所有元素,其开始和结束索引对应于b 中匹配列中给出的第一个和最后一个元素。例如:

A(1, :) = v(b(1, 1):b(2, 1));
A(2, :) = v(b(1, 2):b(2, 2));
A(3, :) = v(b(1, 3):b(2, 3));

等等。显然是b(2,:) = b(1,:) + <i>constant</i>

我可以在 MATLAB 中不使用循环吗?

【问题讨论】:

标签: matlab vectorization


【解决方案1】:

试试这个:

N=8; P=3; M=5;
v = rand(N,1);
b = zeros(2,M);
b(1,:) = [1 2 4 5 6];
b(2,:) = b(1,:) + P - 1;
A = cell2mat(arrayfun(@(i0,i1) v(i0:i1),b(1,:),b(2,:),'UniformOutput',false))'

【讨论】:

  • 然而,需要指出的是,正如here 所讨论的那样,虽然循环占用更多空间,但它们更快。
  • 出于好奇,您为什么需要在没有循环的情况下执行此操作?
  • @user2000581 请注意,bsxfun 通常比两者都快 :)
【解决方案2】:

您可以使用线性索引和bsxfun 直接访问元素:

A = v(bsxfun(@plus, b(1,:).', 0:b(2,1)-b(1,1)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多