Borrar filtros
Borrar filtros

Operations on portions of matrices to the end of the matrices.

1 visualización (últimos 30 días)
First, let me start off by thanking this matlab answers community for its tremendous support for those of us new to the mathematical programming world. I've already been helped immensely by many great minds.
I'm running across an issue at the moment that I cannot wrap my head around and could use some help. I have two matrices, K & Beta. K is always 'n' rows by 4 columns. Beta is also always 'n' rows but can possibly have more columns than K.
The problem is to do mathematical operations on portions of the K and Beta matrices and combine the results in a K_structure matrix. Essentially I want to do the following:
K_structure = Beta(1:4,:)'*K(1:4,:)*Beta(1:4,:) + Beta(5:8,:)'*K(5:8,:)*Beta(5:8,:) + Beta(9:12,:)'*K(9:12,:)*Beta(9:12,:) + ...
So, the first 4 rows of Beta' times the first 4 rows of K times the first 4 rows of Beta then plus the next 4 rows of Beta' times the next 4 rows of K times the next 4 rows of Beta + ... and so on until the end of Beta and K are reached. Based on the program the end row is a multiple of 4 (i.e. 4, 8, 12, 16, etc.)
Any help would be terrific.

Respuesta aceptada

Matt J
Matt J el 11 de Mzo. de 2013
Editada: Matt J el 11 de Mzo. de 2013
Another approach, using FEX:mat2tiles
Kd=mat2tiles(sparse(K),[4,4]);
Kd=blkdiag(Kd{:});
K_structure = Beta.'*Kd*Beta;
Essentially, you should really be maintaining K as a (sparse) block diagonal matrix with 4x4 blocks instead of stacking the 4x4 blocks in an 4mx4 matrix.
  2 comentarios
Mark
Mark el 11 de Mzo. de 2013
I think I need to buy you a drink if I ever meet you Matt.
I'm getting an error with the 'mat2tiles' function. Perhaps it's in a library I don't have or not included with the student version? I see on the link you sent that it only mentions 2012b I have student 2012a grrr.
Undefined function 'mat2tiles' for input arguments of type 'double'.
Error in Truss_2D (line 68) Kd=mat2tiles(sparse(K),[4,4]);
Mark
Mark el 11 de Mzo. de 2013
I figured out it was a function needed that you so kindly provided. Thanks again. I'll have to see if I can spend some time trying to understand how the function works. Thanks

Iniciar sesión para comentar.

Más respuestas (1)

Honglei Chen
Honglei Chen el 11 de Mzo. de 2013
Editada: Honglei Chen el 12 de Mzo. de 2013
Why not just use a for loop?
Let's say your K is 12 rows, so
Niteration = 12/4;
K_structure = zeros(size(Beta,2));
for m = 1:Niteration
idx = (1:4)+(m-1)*4;
K_structure = K_structure + Beta(idx,:)'*K(idx,:)*Beta(idx,:);
end
  3 comentarios
Mark
Mark el 11 de Mzo. de 2013
if I run the program with just
K_structure = Beta(1:4,:)'*K(1:4,:)*Beta(1:4,:)+Beta(5:8,:)'*K(5:8,:)*Beta(5:8,:)+Beta(9:12,:)'*K(9:12,:)*Beta(9:12,:)
I get the following results:
1.0000 0 -1.0000 0 0 0
0 1.0000 0 0 0 -1.0000
-1.0000 0 1.3600 -0.4800 -0.3600 0.4800
0 0 -0.4800 0.6400 0.4800 -0.6400
0 0 -0.3600 0.4800 0.3600 -0.4800
0 -1.0000 0.4800 -0.6400 -0.4800 1.6400
Honglei Chen
Honglei Chen el 12 de Mzo. de 2013
I forgot a bracket in my answer. I updated it.

Iniciar sesión para comentar.

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Productos

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by