【问题标题】:matlab percentage change between cells单元格之间的matlab百分比变化
【发布时间】:2012-05-24 06:16:25
【问题描述】:

我是 Matlab 的新手,只是不知道如何做一个可以在 excel 中轻松执行的简单任务。我只是想获得矩阵中单元格之间的百分比变化。我想为此任务创建一个 for 循环。数据按以下格式设置:

                DAY1 DAY2 DAY3...DAY 100

主题结果

我只能执行获取两个数据点之间的百分比变化。如果跨越多天和多个主题,我将如何进行?并请提供解释

非常感谢

例如,对于第 1 天 SUBJECT1(RESULT=1)、SUBJECT2(RESULT=4)、SUBJECT3(RESULT=5)、第 2 天 SUBJECT1(RESULT=2)、SUBJECT2(RESULT=8)、SUBJECT3(RESULT= 10),第 3 天 SUBJECT1(RESULT=1),SUBJECT2(RESULT=4),SUBJECT3(RESULT=5)。 我想要百分比变化,所以输出将是第 2 天的 SUBJECT1(RESULT=100%)、SUBJECT2(RESULT=100%)、SUBJECT3(RESULT=100%)。 DAY3 SUBJECT1(RESULT=50%),SUBJECT2(RESULT=50%),SUBJECT3(RESULT=50%)

更新:

您好,感谢您的回复。对困惑感到抱歉。 zebediah49 非常接近我正在寻找的东西。例如,我的数据是 10 x 10 双倍。我只是想获得从列到列的百分比变化。例如,如果我想要所有列(从第 2:10 列)从第 1 行到第 10 行的百分比变化。我希望代码适用于任何矩阵维度(例如,1000 x 1000 双)zebediah49 你能解释一下你发布的代码吗?谢谢

更新2: zebediah49,

(数据(1:end,100)-数据(1:end,99))./data(1:end,99)

输出=[data(:,2:end)-data(:,1:end-1)]./data(:,1:end-1)*100;

观察上面的代码,我将如何修改它,以便将第 100 列用作所有其他列 (1-99) 的索引?如果我将代码更改为以下内容:

(数据(1:end,100)-数据(1:end,:))./data(1:end,:)

matlab 无法使用,因为超出了矩阵维度。我将如何实施?

更新 3

西贝迪亚49,

完美运行!!!最初我为索引创建了一个新变量,并重新计算索引以匹配矩阵,这不是一个好主意。在处理大量数据时,复制需要很长时间。 再次感谢您的贡献。

也感谢克里斯的贡献!!!我正在寻找更多关于如何在矩阵中寻址和操作数组。

【问题讨论】:

  • 我不确定你想看到什么,你能提供一个例子,比如五天的输入和预期输出吗?
  • 对不起,我只是不明白你的例子。你能格式化它以使预期的结构显而易见吗?例如,忽略所有 DAY1、SUBJECT1、RESULT(这只是这里的噪音)并将数字格式化为表格。
  • 他想让 [[1,4,5] [2,8,10], [1,4,5]] 变成 [[1,1,1],[-.5 ,-.5,-.5]]。我认为;该示例实际上是模棱两可且自相矛盾的(1->2 是 100% 的变化;2->1 是 50% 的变化??.. 应该是 100%、-50% 或 200%、50% .)
  • 啊,我想我明白了。 (是的,应该是 -50%,而不是 50%。)

标签: matlab


【解决方案1】:

这是matlab;你实际上并不想要一个循环。

output=input(2:end,:)./input(1:end-1,:)*100;

大概会做你想做的事。由于您没有提供有关您的 matlab 结构的任何信息,因此您可能必须更改索引顺序等才能使其正常工作。

如果不是很明显,该行将输出定义为由输入矩阵除以右移一个元素的输入矩阵组成的矩阵。 ./ 运算符很重要,因为它意味着您将每个元素除以其对应的元素,而不是进行矩阵除法。

编辑:要求进一步解释: 我假设您希望将 1->1->2->3->1 形式的 % 更改为 100%, 200%, 150%, 33%。 另一种形式可以通过减去100%得到。

input(2:end,:) 将抓取一个子矩阵,其中第一行被截断。 (我把时间放在第一个维度上......如果你想要它,它会是input(:,2:end)。 Matlab 是 1-indexed,并允许您使用特殊值 end 来引用 las 元素。 因此,end-1 是倒数第二个。 这里的重点是这个矩阵的元素 (i) 是原始矩阵的元素 (i+1)。

input(1:end-1,:) 和上面一样,也会抓取一个子矩阵,只是它缺少最后一列。

然后我将元素 (i) 除以元素 (i+1)。由于我选择子矩阵的方式,它们现在排成一行。

作为半图形演示,使用我上面的数字:

input:          [1 1 2 3 1]
input(2,end):     [1 2 3 1]
input(1,end-1): [1 1 2 3]

当我做除法时,它是第一/第一,第二/第二等等。

input(2:end,:)./input(1:end-1,:):
   [1   2   3   1  ]
./ [1   1   2   3  ]
---------------------
== [1.0 2.0 1.5 0.3]

设置为 (:) 的额外索引意味着它将在所有其他维度上执行该过程。

EDIT2:修改后的问题:如何排除一行,并将其保留为索引。 你说你尝试了(data(1:end,100)- data(1:end,:))./data(1:end,:) 的效果。 Matlab 不会喜欢这样,因为逐个元素的运算符需要它们的大小相同。如果您希望它仅适用于第 100 列,则将第二个索引设置为 100 而不是 : 即可。 相反,我建议将第一个设置为索引,其余设置为数据。 因此,数据是通过切断第一个来处理的:

output=[data(2:end,2:end)-data(2:end,1:end-1)]./data(2:end,1:end-1)*100;

或者,(如果忽略开头,matlab 假定为1;忽略结尾,假定为end,使(:) 成为(1:end) 的简写。

output=[data(2:,2:end)-data(2:,1:end-1)]./data(2:,1:end-1)*100;

但是,您可能仍希望返回索引,在这种情况下,您需要将该子数组附加回来:

output=[data(1,1:end-1) data(2:,2:end)-data(2:,1:end-1)]./data(2:,1:end-1)*100];

这可能不是你应该做的——将数据保存在一个矩阵中,将时间或其他任何东西保存在一个单独的数组中。这使得对数据执行此类操作变得更加容易,而不必担心排除时间。绘图时特别好。

哦,还有一件事:

(data(:,2:end)-data(:,1:end-1))./data(:,1:end-1)*100;

等价于

data(:,2:end)./data(:,1:end-1)*100-100;

【讨论】:

  • 谢谢 zebediah49。我现在明白了很多。
【解决方案2】:

假设 zebediah49 在上面的评论中猜对了并且你想要

1  4  5
2  8 10
1  4  5

变成

   1    1    1
 -.5  -.5  -.5

然后试试这个:

data = [1,4,5; 2,8,10; 1,4,5];
changes_absolute = diff(data);
changes_absolute./data(1:end-1,:)

ans =

    1.0000    1.0000    1.0000
   -0.5000   -0.5000   -0.5000

不需要中间变量,直接写diff(data)./data(1:end,:)即可。我只是认为上面的内容可能更容易阅读。从该结果到百分比数字留给读者作为练习。 :-)

哦,如果你真的想要 50%,而不是 -50%,只需在最后一行使用 abs

【讨论】:

  • 您好,感谢您的回复。对困惑感到抱歉。 zebediah49 非常接近我正在寻找的东西。例如,我的数据是 10 x 10 双倍。我只是想获得从列到列的百分比变化。例如,如果我想要所有列(从第 2:10 列)从第 1 行到第 10 行的百分比变化。我希望代码适用于任何矩阵维度(例如,1000 x 1000 双)zebediah49 你能解释一下你发布的代码吗?谢谢
  • zebediah49 或我发布的代码有什么问题?
  • 嗨,克里斯,我只是想了解如何在大型矩阵中工作。如果我的数据跨越 100 行和 100 列,我想用一个代码找出整个数据集的百分比变化(时间序列分析)怎么办。谢谢。
  • 好吧,运行我们写的。这些代码都没有假设矩阵的大小。 (这就是 1:end-1 等有趣的语法的意义所在。)
  • 克里斯,是的,我试图在之前的评论中感谢你,但提交后它不允许我编辑。再次感谢。现在,我了解了如何将矩阵作为一个整体来处理。
猜你喜欢
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多