根据另一列中的先前值显示Matlab中的值

时间:2020-04-08 11:06:36

标签: matlab dependencies row calculated-columns

我在Matlab中遇到以下问题:

我有一个表,其中包含一些列向量:天,名称,结果 我的目标是创建另一个列向量(新向量),以在每一行中显示对应名称的前一天结果。

| 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行

今天是第二天,名字是“ B” 。向量“ RESULT” 在同一行中显示 1.0 ,但我想在新向量中显示的是“ B” 前一天(在此示例中为第1天)。 由于可以在前一天的第3行中找到“ B” ,因此结果的值为 0.7 应该显示在我的新载体的第5行中。

当day等于1时,逻辑结果是没有值,因为没有前一天。因此,我想在第1天的每一行显示0。

我已经尝试过一些独特的组合来获取索引和一些if子句,但是由于我对Matlab相对较新并且仍然很困惑,所以它根本无法工作。

有人可以提供帮助吗?非常感谢!!

1 个答案:

答案 0 :(得分:1)

您的问题定义不明确,但是下面的代码可以解决您所说的问题。

此代码通过按名称顺序在内部对每一天的信息进行排序而起作用。只需移动然后反转排序操作,就可以轻松创建New Vector。

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