首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab -从包含0的矩阵中删除行和列。

Matlab -从包含0的矩阵中删除行和列。
EN

Stack Overflow用户
提问于 2014-09-26 21:18:15
回答 4查看 1.5K关注 0票数 2

我正在研究一个涉及梁偏转的问题(不太有趣:P)

我需要将全局刚度矩阵简化为结构刚度矩阵,通过从包含0的原始矩阵中删除任何行和列来实现这一点。

所以,如果我有这样的矩阵(让我们称之为K):

代码语言:javascript
复制
0   0   5   3   0   0
0   0   7   8   0   0
7   1   2   6   2   1
3   8   6   9   5   3
0   0   4   5   0   0
0   0   1   8   0   0 

约化矩阵(让我们称之为S)将是公正的

代码语言:javascript
复制
2   6
6   9

以下是我到目前为止所写的将全局矩阵K降为刚度矩阵S的内容

代码语言:javascript
复制
S = K;

for i = 1:length(S(:,1))
    for j = 1:length(S(1,:))
        if  S(i,j) == 0
            S(i,:) = [];
            S(:,j) = [];
            break;
        end
    end
end

但是,在包含"if“语句的行中,我得到了”索引超过矩阵维度“,而且我不确定在删除所有行和列的最佳方法上我的想法是否正确。感谢你的反馈!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-26 21:23:18

简单:

代码语言:javascript
复制
S = K(all(K,2), all(K,1));
票数 3
EN

Stack Overflow用户

发布于 2014-09-26 21:28:58

对于nxn矩阵,也可以尝试基于矩阵乘法的方法-

代码语言:javascript
复制
K=[
    0   0   5   3   2   0
    0   0   7   8   7   0
    7   1   6   6   2   1
    3   8   6   8   5   3
    0   0   4   5   5   0
    5   3   7   8   1   6]  %// Slightly different than the one in question

K1 = double(K~=0)
K2 = K1*K1==size(K,1)
K3 = K(K2)
S = reshape(K3,max(sum(K2,1)),max(sum(K2,2)))

产出-

代码语言:javascript
复制
S =
     6     6     2
     6     8     5
     7     8     1
票数 2
EN

Stack Overflow用户

发布于 2014-09-26 21:39:26

问题是当您删除某些行或列时,不应该增加i或j,但是MATLAB的for循环会自动更新它们。此外,您的算法无法处理以下情况:

代码语言:javascript
复制
0 1 0
1 1 1
1 1 1

由于中断条件,它只会删除第一列,因此您需要删除它,但以某种方式正确地处理索引。另一种方法可能是首先获取行和列的乘积,然后检查这些产品,并在产品的元素为零时删除相应的行和列。MATLAB中的示例实现可能如下所示:

代码语言:javascript
复制
function [S] = stiff(K)
S = K;
% product of each row, rows(k) == 0 if there is a 0 in row k
rows = prod(S,2);
% product of each column, cols(k) == 0 if there is a 0 in column k
cols = prod(S,1);

这里我们计算每一行和每列的乘积。

代码语言:javascript
复制
% firstly eliminate the rows
% row numbers in the new matrix
ii=1;
for i = 1:size(S,1),
    if rows(i) == 0,
        S(ii, :) = []; % delete the row
    else
        ii = ii + 1; % skip the row
    end
end

在这里,我们通过手动更新索引来删除包含零的行(注意ii)。

代码语言:javascript
复制
% handle the columns now
ii = 1;
for i = 1:size(S,2),
    if cols(i) == 0,
        S(:, ii) = []; % delete the row
    else
        ii = ii + 1; % skip the row
    end
end
end

在这里,我们对其余的列应用相同的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26068486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档