我有两个矩阵:矩阵{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
答案 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
如果假设不好,那么我认为你最好不要使用循环。