我有句子交叉词[4 cross 5]矩阵如下:
out=
0 1 1 0 1
1 1 1 0 0
0 0 1 1 0
1 1 0 1 1
我想基于上面的矩阵创建一维单元格数组,该矩阵应该告诉value = 1
出现哪两个句子相同的单词,即让line 1
和line 2
进入在2 column 2
和column 3
处,逻辑矩阵在1's
和row 1
中都有row 2
,此信息应存储在1D单元格数组中。
假设以上示例,它的输出将为:
output{1,1} = []
output{1,2} = [2 3]
output{1,3} = [3]
.....
output{n,n} = [....]
其中{1,1}
根据sentence 1
字词告诉sentence 1
与value=1
的关系,{1,2}
告诉sentence 1
与sentence 2
的关系} value=1
基于{{1}}等等...
答案 0 :(得分:4)
如果你想要快速编写的东西......而且由于我们正在处理单元格数组,最简单的方法就是拥有一对for
循环。假设您在out
中定义了矩阵:
out_cell = cell(size(out,1),size(out,1));
for idx = 1 : size(out,1)
for idx2 = 1 : idx
vals = find(out(idx,:) & out(idx2,:));
out_cell{idx,idx2} = vals;
out_cell{idx2,idx} = vals;
end
end
对于每对行idx
和idx2
,我们会查看是否有任何列匹配1,然后将索引放入2D单元格数组中的相应单元格位置。请注意,因为会遇到重复的行对(即检查第3行和第5行,与第5行和第3行相比),所以不需要第二个for
循环遍历其他行。我们只需要检查外部循环描述的当前行,我们只需要交换行索引来写相同的值...所以这是一个"对称的"基质
如果您希望对角元素为空,只需更改内部for
循环,使其变为for idx2 = 1 : idx-1
,而不是for idx2 = 1 : idx
。
通过您的示例,我们得到:
>> out_cell
out_cell =
[1x3 double] [1x2 double] [ 3] [1x2 double]
[1x2 double] [1x3 double] [ 3] [1x2 double]
[ 3] [ 3] [1x2 double] [ 4]
[1x2 double] [1x2 double] [ 4] [1x4 double]
>> celldisp(out_cell)
out_cell{1,1} =
2 3 5
out_cell{2,1} =
2 3
out_cell{3,1} =
3
out_cell{4,1} =
2 5
out_cell{1,2} =
2 3
out_cell{2,2} =
1 2 3
out_cell{3,2} =
3
out_cell{4,2} =
1 2
out_cell{1,3} =
3
out_cell{2,3} =
3
out_cell{3,3} =
3 4
out_cell{4,3} =
4
out_cell{1,4} =
2 5
out_cell{2,4} =
1 2
out_cell{3,4} =
4
out_cell{4,4} =
1 2 4 5
答案 1 :(得分:4)
试试这个:
x = [ 0 1 1 0 1
1 1 1 0 0
0 0 1 1 0
1 1 0 1 1];
[ii, jj] = ndgrid(1:size(x,1));
y = arrayfun(@(m,n) find(x(m,:) & x(n,:)), ii, jj, 'uniformoutput', 0);
结果:
y{1,1} =
2 3 5
y{2,1} =
2 3
y{3,1} =
3
y{4,1} =
2 5
[...]
如果您希望对角线元素为空:
y = arrayfun(@(m,n) find(x(m,:) & x(n,:) & m~=n), ii, jj, 'uniformoutput', 0)
结果:
y{1,1} =
[]
y{2,1} =
2 3
y{3,1} =
3
y{4,1} =
2 5
[...]