【问题标题】:Reshaping, overlapping columns of array into vector in MATLAB在MATLAB中将数组的重叠列重塑为向量
【发布时间】:2015-07-09 15:32:26
【问题描述】:

我想通过列将数组重塑为向量,并且我想在每列之间有一个偏移量,并将重叠的元素加在一起。 有任何想法吗?我已经使用双 for 循环完成了它,但我希望有更有效的东西......

for i=1:b                   
    for j=1:a
        overlap=j+(i-1)*offset;
        vector(overlap) = vector(overlap) + (array(j,i));
end
end

例如我想拥有:

[ 1 4 7 ] 
[ 2 5 8 ]
[ 3 6 9 ]

并且列之间的偏移量为 1,那么我想得到以下向量:

[ 1 2 7 5 13 8 9 ]

编辑我想过追加零,然后像这样添加每列

[ 1 2 3 0 0 0 0 ]
[ 0 0 4 5 6 0 0 ]
[ 0 0 0 0 7 8 9 ]

然后使用每列总和以获得一个新向量,其中元素为列的总和。 有谁知道创建这种对角矩阵的快速方法?

【问题讨论】:

  • “我想在每列之间有一个偏移量,将重叠的元素加在一起。”请举例说明
  • 即第一列的最后 x 个元素应添加到下一列的前 x 个元素。
  • 一个小矩阵的数值例子如何转换成你想要的格式?
  • 确定我会在上面编辑我的帖子。 -编辑

标签: arrays matlab vector reshape overlap


【解决方案1】:

基本上你需要的是这个矩阵的通用公式:

[ 1 2 3 0 0 0 0 ]
[ 0 0 4 5 6 0 0 ]
[ 0 0 0 0 7 8 9 ]

如果我们将矩阵重写如下,这会容易一些:

[ 1 2 3 0 0 0 0 0 0 4 5 6 0 0 0 0 0 0 7 8 9 ]

我将在没有证据的情况下声明每组非零数之间的零数等于:

nz = (size(array,1) - overlap) * size(array,2);

您应该能够相当容易地说服自己这是正确的。现在我们可以执行以下操作:

vector = [array;zeros(nz,size(array,2)];
vector = vector(1:end-nz);

给了

vector = [ 1 2 3 0 0 0 0 0 0 4 5 6 0 0 0 0 0 0 7 8 9 ]

然后我们只是重塑和求和:

vector = sum(reshape(vector,[],size(array,2))');
vector =
     1     2     7     5    13     8     9

【讨论】:

  • 谢谢!但为什么不像 vector=reshape(array',1,21); ?
  • 在 array=[ 1 2 3 0 0 0 0 上使用您的代码; 0 0 4 5 6 0 0; 0 0 0 0 7 8 9];我得到以下向量 [1 0 2 0 3 4 0 5 0 6 7 0 8 0 9 ]
  • 我以为array = [1 2 3; 4 5 6; 7 8 9]?
  • 是的,但是有了那个我得到vector=[1 4 9 5 11 6 9]
  • 啊,对不起。您在原始问题中显示的数组是[1 2 3; 4 5 6; 7 8 9]'。注意转置。这就是我的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
相关资源
最近更新 更多