Matlab 矩阵 提取部分非零元素组成新矩阵A矩阵[1 2 3 0 0;1 2 0 0 0;5 0 0 0 0;0 0 0 2 1;0 0 0 0 6]提取后要求效果是矩阵B[1 2 3;1 2 0;5 0 0]和C[2 1;0 6] 最好能返回矩阵B和矩阵C在原矩阵上相应坐标
来源:学生作业帮助网 编辑:作业帮 时间:2024/05/05 06:24:27
Matlab 矩阵 提取部分非零元素组成新矩阵A矩阵[1 2 3 0 0;1 2 0 0 0;5 0 0 0 0;0 0 0 2 1;0 0 0 0 6]提取后要求效果是矩阵B[1 2 3;1 2 0;5 0 0]和C[2 1;0 6] 最好能返回矩阵B和矩阵C在原矩阵上相应坐标
Matlab 矩阵 提取部分非零元素组成新矩阵
A矩阵[1 2 3 0 0;1 2 0 0 0;5 0 0 0 0;0 0 0 2 1;0 0 0 0 6]
提取后要求效果是矩阵B[1 2 3;1 2 0;5 0 0]和C[2 1;0 6]
最好能返回矩阵B和矩阵C在原矩阵上相应坐标之类的.
如果原来的A矩阵[1 2 3 0 1;1 2 0 0 0;5 0 0 0 0;0 0 0 0 0;0 0 0 0 0]
提取后要求效果是矩阵B[1 2 3;1 2 0;5 0 0]和C[1] .
矩阵A是未知的,随机的,我上面只是举个例子,希望能得到个通用的方法.
总体上来说,我的希望是是在某个a*b的随机矩阵中,找出相邻的非零的元素,然后将他们提取出来重新组成新的矩阵,新的矩阵不要求是方阵,可以是n*m的(m不等于n),其中空的元素可以用0元素代替,和聚类有点儿相似.
Matlab 矩阵 提取部分非零元素组成新矩阵A矩阵[1 2 3 0 0;1 2 0 0 0;5 0 0 0 0;0 0 0 2 1;0 0 0 0 6]提取后要求效果是矩阵B[1 2 3;1 2 0;5 0 0]和C[2 1;0 6] 最好能返回矩阵B和矩阵C在原矩阵上相应坐标
function M = submatrix(B)
% 提取部分非零元素组成新矩阵
% C用来表示B的那些位置元素已被提取
C = B~=0;
M = [];
while any(C(:))
[M1, C] = local_submatrix(B, C);
M = [M; M1];
end
% 最后应判断后面提取的子矩阵是否包含前面的
% 这是因为,提取子矩阵是由从左上角开始的,仅取左上角的子矩阵已不和其它部分
% 相连,但如果放在一个更大的范围里面,则可能通过其它部分桥接而相连
repeat = [];
for i = 1 : length(M)-1
for j = i+1 : length(M)
if ( M(j).pos(1) 1
if ~isempty( find(B(r, c(1)) .* B(r, c(1)-1)) )
c = c(1)-1 : c(end);
expand = true;
end
end
% 向右
if c(end) < n
if ~isempty( find(B(r, c(end)) .* B(r, c(end)+1)) )
c = c(1) : c(end)+1;
expand = true;
end
end
% 若四个方向均无法扩张,则停止尝试
if ~expand, break, end
end
% 提取子矩阵,并把子矩阵原来的位置清0
M = B(r, c)
C(r, c) = 0;
% 返回结果,其中pos为子矩阵左上角元素在原矩阵中的位置
M = struct('M',M,'pos',[r(1) c(1)]);