【问题标题】:How to subtract every nth column in Matlab如何在Matlab中减去每n列
【发布时间】:2014-09-02 20:18:06
【问题描述】:

如果我有一个名为 data 的任意 n*m 矩阵,我想使用逐渐增大的步长来获取矩阵的差异。

第一种情况的第一列等于data(:,2)-data(:,1),下一列是data(:,3)-data(:,2),依此类推。这可以通过以下函数来完成。

data = diff(data,1,2)

同样,我还想根据每隔一列计算差异,以便第一个条目是 data(:,3)-data(:,1),下一个是 data(:,5)-data(:,3),依此类推。

这不能用 diff 来完成,但是有没有其他函数或方法可以在不诉诸循环的情况下做到这一点?

我需要对每个不超过 50 的 n 值做同样的事情。

【问题讨论】:

  • 偶数列会发生什么?它们是在输出中留下还是被删除?输出 w.r.t 的大小是多少? nm?如果连 num cols 都没有留下,那么只需使用 data(:,[2:2:end]=[] 删除它们,然后使用您的 diff
  • 总的来说,只要 n (步长是偶数),它们仍然会被使用,但我想我可以这样做作为一种解决方法。不过,prolly 仍然会让我循环播放。

标签: matlab


【解决方案1】:

使用column indexing 选择“正确”列,然后使用您最喜欢的diff -

A = randi(9,4,9) %// Input array
stepsize = 2; %// Edit this for a different stepsize
out = diff(A(:,1:stepsize:end),1,2)

输出 -

A =
     8     9     9     8     3     2     6     8     7
     2     5     5     7     5     3     9     6     3
     2     7     7     2     4     1     2     4     1
     6     2     1     5     4     9     9     3     7
out =
     1    -6     3     1
     3     0     4    -6
     5    -3    -2    -1
    -5     3     5    -2

【讨论】:

  • 为什么不只是diff(A(:,1:stepsize:end),1,2)
  • @LuisMendo 这太尴尬了!错过了! :) 谢谢!!
  • 并非如此。这几乎和你在评论中写的一样:-)
  • 我删除了它,因为它回答了一个不同的问题。我认为 OP 不想跳过原始矩阵的列;他只是想计算n阶差。另外,现在想来,n阶差可以用diff计算;不需要或conv2
  • @LuisMendo 好!已编辑。
【解决方案2】:

我只是为此目的编写了一个简单的包装函数。

function [ out ] = diffhigh( matrix, offset )
    matrix_1 = matrix(:,(offset+1):size(matrix,1));
    matrix_2 = matrix(:, 1:(size(matrix,1)-offset));
    out = matrix_1 - matrix_2;
end


>> a

a =

    3     5     1     2     4
    1     2     3     4     5
    1     4     5     3     2
    1     2     4     3     5
    2     1     5     3     4


>> diffhigh(a, 2)

ans =

    -2    -3     3
     2     2     2
     4    -1    -3
     3     1     1
     3     2    -1

>> diffhigh(a, 3)

ans =

    -1    -1
     3     3
     2    -2
     2     3
     1     3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多