给定任意维数的矩阵NaN
,其中在某个反对角下所有的值都是未知的,我想提取没有NaN
值的子矩阵,这些子矩阵尽可能大,使得原始矩阵中的元素尽可能多地包含在子矩阵中。每个子矩阵必须至少为R
a x x R
。其中R
可以由用户指定。子矩阵可以相互重叠。我可以找到所有元素都是NaN的反对角,但我真的不知道如何将矩阵的非NaN部分划分为子矩阵,以尽可能多地覆盖已知值。
下图说明了如何将矩阵的数值部分划分为R = 3
的子矩阵:Possible submatrix division
下面的代码:
mask = ~isnan(A);
nrKnownElsRow = sum(mask,2);
dims = [[1:length(nrKnownElsRow)]' nrKnownElsRow];
dims(dims(:,2)<R,:) = [];
dims(dims(:,1)<R,:) = [];
idx = find(dims(:,2) == max(dims(:,2)));
dims(idx(1:end-1),:) = [];
dims = [dims(:,1) zeros(length(dims),1) dims(:,2)];
for k = 1:length(dims)-1
if dims(k,3) - dims(k+1,3) >= R
dims(k,2) = dims(k+1,3) + 1;
else
dims(k,2) = dims(k,3) - R + 1;
end
end
dims(end,2) = 1;
变量dims
在对应子矩阵的每一行中包含子Tensor所到达的行,然后是组成子矩阵的外部列。这使用了矩阵中尽可能多的信息,但子矩阵不是尽可能大。
1条答案
按热度按时间p5fdfcr11#
下面的解决方案并不完美,但它可能会帮助您入门。
此脚本捕获所有边为1或两边均大于
r
(定义为R的阈值)的子矩阵。生成
A
查找NaNs坐标
现在,
L2x
和L2y
包含所有单坐标组合将
L2x
和L2y
组合成单个变量L3
移除任何包含NaN的子矩阵
计算所有子矩阵组合、对子矩阵,无重复
在每条
cnL3
线上附加一个标记,以表明是a1(a2),还是a2(a1),还是a1==a2。cnL3
:[ ... A51_contains_A52 A52_contains_A51]
谁包含谁
含子矩阵偶
从子矩阵列表
L3
中删除包含的子矩阵X
:包含所有符合子矩阵的单元格阅读单元格
X
的1个元素如何做一个细胞全力
只需键入
X
,MATLAB就会返回单元格X
内所有大小的元素现在是您要求的阈值
r
这对我查过的几个案子都有效。
注:我生成的测试矩阵沿着没有NaN。
Stijn,如果这个解决方案有帮助的话,请你考虑一下,把它作为有效的答案?
感谢阅读