lizsav
lizsav

Reputation: 85

Create band matrix in Matlab

I'm trying to create a band matriz in Matlab, which should looks like this for matrix_size = 6 and band_width = 1:

[1,1,0,0,0,0]
[1,2,2,0,0,0]
[0,2,3,3,0,0]
[0,0,3,4,4,0]
[0,0,0,4,5,5]
[0,0,0,0,5,6]

The values should be like this. I did function, which gives me result:

[1,1,0,0,0,0]
[1,1,1,0,0,0]
[0,1,1,1,0,0]
[0,0,1,1,1,0]
[0,0,0,1,1,1]
[0,0,0,0,1,1]

Code of my function:

function M=bandmatrix(n,r)
% n -- matriz size 
% r -- band width
% n >= r + 2

M = sign(conv2(eye(n),ones(r+1),'same'));

end

How I can do this function? I also would be grateful for the function, in which walues are the same as I want, but function doesn't depends on band width. Thank you!

Upvotes: 2

Views: 97

Answers (2)

Eric Johnson
Eric Johnson

Reputation: 714

You could also do something like:

clear;

m = 6;
n = 6;

diags = repmat((1:6)', 1, 3);
diagidx = [-1:1];

for k = 1:length(diagidx)
    if(diagidx(k) > 0)
        diags(:, k) = circshift(diags(:, k), diagidx(k), 1);
    end
end

sparseMat = spdiags(diags, [-1:1], m, n);

myMat = full(sparseMat)

Using sparse matrix allows us to specify the data and allocate only once. But it also means the values used in the diagonal are needed to be shifted according to the matrix being fat or skinny.

Upvotes: 1

bla
bla

Reputation: 26069

you can use diag as follows:

 diag(1:6)+diag(1:5,1)+diag(1:5,-1)

Generally, for any order n:

 diag(1:n)+diag(1:n-1,1)+diag(1:n-1,-1)

Upvotes: 2

Related Questions