我正在研究一个涉及梁偏转的问题(不太有趣:P)
我需要将全局刚度矩阵简化为结构刚度矩阵,通过从包含0的原始矩阵中删除任何行和列来实现这一点。
所以,如果我有这样的矩阵(让我们称之为K):
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)将是公正的
2 6
6 9以下是我到目前为止所写的将全局矩阵K降为刚度矩阵S的内容
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“语句的行中,我得到了”索引超过矩阵维度“,而且我不确定在删除所有行和列的最佳方法上我的想法是否正确。感谢你的反馈!
发布于 2014-09-26 21:23:18
简单:
S = K(all(K,2), all(K,1));发布于 2014-09-26 21:28:58
对于nxn矩阵,也可以尝试基于矩阵乘法的方法-
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)))产出-
S =
6 6 2
6 8 5
7 8 1发布于 2014-09-26 21:39:26
问题是当您删除某些行或列时,不应该增加i或j,但是MATLAB的for循环会自动更新它们。此外,您的算法无法处理以下情况:
0 1 0
1 1 1
1 1 1由于中断条件,它只会删除第一列,因此您需要删除它,但以某种方式正确地处理索引。另一种方法可能是首先获取行和列的乘积,然后检查这些产品,并在产品的元素为零时删除相应的行和列。MATLAB中的示例实现可能如下所示:
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);这里我们计算每一行和每列的乘积。
% 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)。
% 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在这里,我们对其余的列应用相同的操作。
https://stackoverflow.com/questions/26068486
复制相似问题