根据另一列中的先前值在 Matlab 中显示值
Show values in Matlab depending on previous values in another column
我在 Matlab 中遇到以下问题:
我有一个 table 包含几个列向量:Day、Name、Result
我的目标是创建另一个列向量(新向量),它在每一行中显示相应名称前一天的结果。
| Day | Name | Result | New Vector |
|-----|------|--------|------------|
| 1 | A | 1.2 | 0 |
| 1 | C | 0.9 | 0 |
| 1 | B | 0.7 | 0 |
| 1 | D | 1.1 | 0 |
| 2 | B | 1 | 0.7 |
| 2 | A | 1.5 | 1.2 |
| 2 | C | 1.4 | 0.9 |
| 2 | D | 0.9 | 1.1 |
| 3 | B | 1.1 | 1 |
| 3 | C | 1.3 | 1.4 |
| 3 | A | 1 | 1.5 |
| 3 | D | 0.3 | 0.9 |
例如第5行:
今天是 第 2 天,名字是 "B"。向量 "RESULT" 在同一行显示 1.0 但我想在新向量中显示的是 "B" 前一天(本例中为第 1 天)。
由于可以在前一天的 行 3 中找到 "B",因此 result 值是 0.7,它应该显示在我的新向量的 行 5 中。
当天等于 1 时,逻辑结果是没有值,因为没有前一天。因此,我想在第 1 天为每一行显示 0。
我已经尝试了一些 unique 的组合来获取索引和一些 if 子句,但它根本不起作用,因为我对 Matlab 比较陌生并且仍然很困惑。
有人能帮忙吗?非常感谢!!
您的问题没有明确定义,但下面的代码可以解决您的问题。
此代码的工作原理是在内部按名称顺序对每一天的信息进行排序。这允许通过简单地移动然后反转排序操作来轻松创建新向量。
close all; clear all; clc;
% A few column vectors
Day = [1;1;1;1;2;2;2;2;3;3;3;3];
Name = ['A';'C';'B';'D';'B';'A';'C';'D';'B';'C';'A';'D'];
Result = [1.2;0.9;0.7;1.1;1;1.5;1.4;0.9;1.1;1.3;1;0.3];
% Sort the table (so Name is in order for each Day)
[~,Index] = sort(max(Name)*Day + Name);
Day = Day(Index);
Name = Name(Index);
Result = Result(Index);
% Shift Result to get sorted NewVector
NewVector = circshift(Result, 4);
NewVector(1:4) = 0;
% Unsort NewVector, to get original table ordering
ReverseIndex(Index) = 1:length(Index);
NewVector = NewVector(ReverseIndex)
这将打印以下结果:
NewVector =
0
0
0
0
0.7000
1.2000
0.9000
1.1000
1.0000
1.4000
1.5000
0.9000
我在 Matlab 中遇到以下问题:
我有一个 table 包含几个列向量:Day、Name、Result 我的目标是创建另一个列向量(新向量),它在每一行中显示相应名称前一天的结果。
| Day | Name | Result | New Vector |
|-----|------|--------|------------|
| 1 | A | 1.2 | 0 |
| 1 | C | 0.9 | 0 |
| 1 | B | 0.7 | 0 |
| 1 | D | 1.1 | 0 |
| 2 | B | 1 | 0.7 |
| 2 | A | 1.5 | 1.2 |
| 2 | C | 1.4 | 0.9 |
| 2 | D | 0.9 | 1.1 |
| 3 | B | 1.1 | 1 |
| 3 | C | 1.3 | 1.4 |
| 3 | A | 1 | 1.5 |
| 3 | D | 0.3 | 0.9 |
例如第5行:
今天是 第 2 天,名字是 "B"。向量 "RESULT" 在同一行显示 1.0 但我想在新向量中显示的是 "B" 前一天(本例中为第 1 天)。 由于可以在前一天的 行 3 中找到 "B",因此 result 值是 0.7,它应该显示在我的新向量的 行 5 中。
当天等于 1 时,逻辑结果是没有值,因为没有前一天。因此,我想在第 1 天为每一行显示 0。
我已经尝试了一些 unique 的组合来获取索引和一些 if 子句,但它根本不起作用,因为我对 Matlab 比较陌生并且仍然很困惑。
有人能帮忙吗?非常感谢!!
您的问题没有明确定义,但下面的代码可以解决您的问题。
此代码的工作原理是在内部按名称顺序对每一天的信息进行排序。这允许通过简单地移动然后反转排序操作来轻松创建新向量。
close all; clear all; clc;
% A few column vectors
Day = [1;1;1;1;2;2;2;2;3;3;3;3];
Name = ['A';'C';'B';'D';'B';'A';'C';'D';'B';'C';'A';'D'];
Result = [1.2;0.9;0.7;1.1;1;1.5;1.4;0.9;1.1;1.3;1;0.3];
% Sort the table (so Name is in order for each Day)
[~,Index] = sort(max(Name)*Day + Name);
Day = Day(Index);
Name = Name(Index);
Result = Result(Index);
% Shift Result to get sorted NewVector
NewVector = circshift(Result, 4);
NewVector(1:4) = 0;
% Unsort NewVector, to get original table ordering
ReverseIndex(Index) = 1:length(Index);
NewVector = NewVector(ReverseIndex)
这将打印以下结果:
NewVector =
0
0
0
0
0.7000
1.2000
0.9000
1.1000
1.0000
1.4000
1.5000
0.9000