【问题标题】:find and replace zeros with a function in matlab在matlab中用函数查找和替换零
【发布时间】:2012-07-24 14:27:05
【问题描述】:

再一次,很抱歉之前是否有人问过这个问题,如果它太具体了,但我很困惑,找不到解决方案。

我有一个矩阵,它由一个名为 2、4 和 16(在第 1 列中)的结构的 3 个成员组成,它们的相对距离具有值,例如成员 2 在开始处有值,0m,然后在 0.5m,然后在其长度 1.5m 结束处,成员 4 从 0m 开始等等。所以我的矩阵看起来像这样:

2   0     125
2   0.5   25
2   1.5   365
4   0     25
4   0.6   57
16  0     354
16  0.2   95
16  0.8   2

我想创建一个矩阵,将所有成员 2、4 和 16 的总距离组合起来:

2   0     125
2   0.5   25
2   1.5   365
4   1.5   25
4   2.1   57
16  2.1   354
16  2.3   95
16  3.1   2

在matlab中有什么方法可以做到这一点吗?就像可能找到第一个零并将其上方的值添加到下面的所有其余值中,然后找到下一个零值等等?

如果不清楚,请告诉我,我知道这有点令人困惑,但不太确定如何更好地解释它!

【问题讨论】:

  • 听起来你是在做累计,但对我来说不是很清楚。你能再澄清一点吗?
  • 我认为你的算法没有问题。您能具体说明问题所在吗?
  • @Amro 我不认为这是一个累积和。他的矩阵中有三个连续的部分(按行),并且想要将第 2 部分的第 2 列中的数据移动到最后一部分,以便它们都相互连接。现在第二列在每个部分开始时重置为零。
  • @aiuto:有没有可能在成员的开头有多个零?
  • 我是这么想的,但是aiuto的例子也有错误(他的第二个矩阵中的3.1应该是2.9)@aiuto:请反馈一下

标签: matlab replace find sum


【解决方案1】:

我想出了以下内容:

idx = find(diff(M(:,1)));
v = zeros(size(M,1),1);
v(idx+1) = M(idx,2);
M(:,2) = M(:,2) + cumsum(v);

结果:

M =
            2            0          125
            2          0.5           25
            2          1.5          365
            4          1.5           25
            4          2.1           57
           16          2.1          354
           16          2.3           95
           16          2.9            2

请注意,第二列中的最后一个值与您所描述的不一致(2.93.1)。要么是你打错了,要么我还是没听懂……

【讨论】:

  • 嗨!非常感谢,是的,抱歉有错字,应该是2.9!我无法相信我是多么坚持这个再次感谢!
【解决方案2】:
data = [2   0     125;
        2   0.5   25;
        2   1.5   365;
        4   0     25;
        4   0.6   57;
        16  0     354;
        16  0.2   95;
        16  0.8   2];

idx0 = find(data(:,2)==0);
idx0 = idx0(2:end); %ignore first zero of first member, doesn't need an offset

offset = data(idx0-1,2);
N = size(data,1);
for ii=1:numel(idx0)
    idxs = 1:N>=idx0(ii);
    data(idxs,2) = data(idxs,2) + offset(ii);
end

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2014-07-05
    相关资源
    最近更新 更多