statsguyz
statsguyz

Reputation: 459

Changing index of matrix

I'm trying to change the following code so that the first matrix will become the second matrix:

function BellTri = matrix(n)
BellTri = zeros(n);
BellTri(1,1) = 1;
for i = 2:n
  BellTri(i,1) = BellTri(i-1,i-1);
  for j = 2:i
    BellTri(i,j) = BellTri(i - 1,j-1) + BellTri(i,j-1);
  end
end
BellTri

First matrix (when n = 7)

 1     0     0     0     0     0     0
 1     2     0     0     0     0     0
 2     3     5     0     0     0     0
 5     7    10    15     0     0     0
15    20    27    37    52     0     0
52    67    87   114   151   203     0
203   255   322   409   523   674   877

Second matrix

1     1     2     5     15    52    877
1     3     10    37    151   674     0
2     7     27    114   523    0      0 
5    20     87    409    0     0      0
15   67     322    0     0     0      0
52   255    0      0     0     0      0
203   0     0      0     0     0      0

Upvotes: 0

Views: 55

Answers (2)

user1543042
user1543042

Reputation: 3440

An option is to cyclically permute the columns using circshift.

function [BellTri, Second] = matrix(n)
BellTri = zeros(n);
BellTri(1,1) = 1;
for i = 2:n
  BellTri(i,1) = BellTri(i-1,i-1);
  for j = 2:i
    BellTri(i,j) = BellTri(i - 1,j-1) + BellTri(i,j-1);
  end
end

Second = BellTri;

for i = 1:n
    Second(:, i) = circshift(Second(:,i), 1-i);
end

for i = n-1:-1:2
    Second(1, i) = Second(1, i-1);
end
end

Input: [BellTri, Second] = matrix(7)

Output:

BellTri =

     1     0     0     0     0     0     0
     1     2     0     0     0     0     0
     2     3     5     0     0     0     0
     5     7    10    15     0     0     0
    15    20    27    37    52     0     0
    52    67    87   114   151   203     0
   203   255   322   409   523   674   877


Second =

     1     1     2     5    15    52   877
     1     3    10    37   151   674     0
     2     7    27   114   523     0     0
     5    20    87   409     0     0     0
    15    67   322     0     0     0     0
    52   255     0     0     0     0     0
   203     0     0     0     0     0     0

Upvotes: 1

Santhan Salai
Santhan Salai

Reputation: 3898

One approach:

out = zeros(size(A));
out(logical(fliplr(triu(ones(size(A,1)))))) = A(logical(tril(ones(size(A,1)))));

Note: As Divakar pointed out, there should be a typo in the first row. This method gives the corrected one.

Results:

A = [1     0     0     0     0     0     0;
     1     2     0     0     0     0     0;
     2     3     5     0     0     0     0;
     5     7    10    15     0     0     0;
    15    20    27    37    52     0     0;
    52    67    87   114   151   203     0;
    203   255   322   409   523   674   877];

>> out

out =

   1     2     5    15    52   203   877
   1     3    10    37   151   674     0
   2     7    27   114   523     0     0
   5    20    87   409     0     0     0
  15    67   322     0     0     0     0
  52   255     0     0     0     0     0
 203     0     0     0     0     0     0

Upvotes: 1

Related Questions