How to only perform the upper triangular part of matrix operations?

5 vues (au cours des 30 derniers jours)
Xh Du
Xh Du le 26 Avr 2017
Commenté : Xh Du le 27 Avr 2017

Hi all,

I'm trying to solve this problem, where I have to use a nested loop like this:

clear; clc;
demo = zeros(4, 4);
indj = 1;
for l = 1:2
      for j = 1:2
          indi = 1;
          for k = 1:2
              for i = 1:2
                  disp([indi, indj])
                  demo(indi, indj) = 1;
                  indi = indi + 1;
              end
          end
          indj = indj + 1;
      end
  end

In this code, i, j, k, l each has 2 operations, thus total number of operations is 2^4 = 16. A 4 by 4 matrix 'demo' is filled by these 16 operations (each operation is represented by 'demo(indi, indj) = 1;'), while indi and indj are used to indicate the coordinate of these operations. 'demo' is a 4 by 4 matrix made of 1s.

>> demo
demo =
     1     1     1     1
     1     1     1     1
     1     1     1     1
     1     1     1     1

Now in my problem, because 'demo' is symmetric along the main diagonal, I'm trying to only compute the upper triangular part of 'demo' to save cost, i.e. I want 'demo' to be like:

>> demo
demo =
     1     1     1     1
     0     1     1     1
     0     0     1     1
     0     0     0     1

while the form of using i, j, k, l cannot be changed. I tried the following (only change to k = l:2 and i = j:2):

clear; clc;
  demo = zeros(4, 4);
  indj = 1;
  for l = 1:2
        for j = 1:2
            indi = 1;
            for k = l:2
                for i = j:2
                    disp([indi, indj])
                    demo(indi, indj) = 1;
                    indi = indi + 1;
                end
            end
            indj = indj + 1;
        end
    end

It doesn't work. Any ideas?

Réponse acceptée

James Tursa
James Tursa le 26 Avr 2017
If you can't change the looping, then maybe just insert an if-test:
if( indi <= indj )
demo(indi, indj) = 1;
end
  1 commentaire
Xh Du
Xh Du le 27 Avr 2017
Thanks! This works! Notice that this needs to be inserted in the first piece of code in my original question.

Connectez-vous pour commenter.

Plus de réponses (0)

Community Treasure Hunt

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

Start Hunting!

Translated by