How do I make matrix of ones and zeros alternating depending on size and elements of an array?

5 次查看(过去 30 天)
I have an array, A, and I want to make a matrix, B, that has the size dependent on A, and has 1s and 0s alternating, depending on the value of elements in A
E.g. A=[1;2;3;4;5]
B should be of size: ((length(A)+1)/2,sum(A)]
In this case B would be a matrix of 3x15
Then the values for B needs to be be thus:
row 1:[ones(A(1)),zeros(A(2)),zeros(A(3)),zeros(A(4)),zeros(A(5))]
row2: [zeros(A(1)),zeros(A(2)),ones(A(3)),zeros(A(4)),zeros(A(5))]
row3: [zeros(A(1)),zeros(A(2)),zeros(A(3)),zeros(A(4)),ones(A(5))]
B should look like:
[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 1 1 1 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1]
I've been trying to formulate something with a nested for look for each dimension of B, but have not been succesful!
Would really appreciate any help thanks!

采纳的回答

Fabio Freschi
Fabio Freschi 2019-9-26
% initialize
iRow = [];
jCol = [];
% preallocate
B = zeros((length(A)+1)/2,sum(A));
% indices for columns
idx = [0; cumsum(A)]+1;
for i = 1:length(A)
if mod(i,2) ~= 0
iRow = [iRow; repmat((i+1)/2,A(i),1)];
jCol = [jCol; (idx(i):idx(i+1)-1).'];
end
end
B(sub2ind(size(B),iRow,jCol)) = 1;

更多回答(1 个)

Guillaume
Guillaume 2019-9-26
Here's a fairly simple way:
B = zeros((numel(A)+1)/2, sum(A));
for row = 1:2:numel(A)
B(ceil(row/2), :) = repelem([0, 1, 0], [sum(A(1:row-1)), A(row), sum(A(row+1:end))]);
end

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

标签

产品

Community Treasure Hunt

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

Start Hunting!

Translated by