Если вы хотите, чтобы что-то было написано быстро ... и поскольку мы имеем дело с клеточными массивами, то проще всего иметь пару 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, а затем поместить индексы в соответствующую ячейку расположение в массиве двумерных ячеек. Обратите внимание, что поскольку будут встречаться пары строк, которые являются дубликатами (т. Е. Проверяя строку 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,3} = [1]'? Разве это не должно быть '[3]'? –
@ LuisMendo извините, это мое плохое, я сделал ошибку - спасибо, что указали это. вопрос исправлен –
И не должен выводить {1,1} 'be' [2 3 5] '? –