Matlab复杂的

时间:2012-07-31 13:21:34

标签: matlab

我有两个矩阵:矩阵{a}< 252x1>是矩阵{b}< 252x4000>的子集。我需要确定矩阵{b}中矩阵{a}的值之前和之后的天数。

Example:

Matrix a  Matrix b
10       12 34 54 10
23       23 98 78 98
43       98 53 43 88
44       98 44 88 78

Output
1  1  1  10
23 1  1  1
1  1  43 1
1  44 1  1

Days
3 0
0 3
2 1
1 2

2 个答案:

答案 0 :(得分:1)

假设每行a中只有一个b出现:

使用bsxfun获取result

result=ones(size(b));
ainb=bsxfun(@eq,a,b);
result(ainb)=b(ainb);

使用带有两个输出参数的find查找a位于b的列索引,并从中推断出天数:

[colidx_rev,~] = find(ainb);
colidx(colidx_rev,1) = 1:4;

Days = [colidx-1 size(b,2)-colidx];

您会看到any(sum(ainb,2)>1)时每行有多个匹配项。接下来要做的就是选择一个(例如第一场比赛)。通过使用arrayfun:

使用循环或更短的方式以另一种方式查找列索引来执行此操作
col_idx = arrayfun(@(rowi) find(ainb(rowi,:),1),1:size(b,1))';

其余的相似。

答案 1 :(得分:1)

这个答案假设每行只有一个匹配:

a = [10;23;43;44]
b = [12 34 45 10;23 98 78 98;98 53 43 88; 98 44 88 78]
l = bsxfun(@eq, a, b)
[c r] = find(l')
Days = [c - 1, size(b, 2) - c]
Output = b.*l + ~l

如果假设不好,那么我认为你最好不要使用循环。