How can I convert a numeric matrix(a) to a 0 and 1 matrix(b)?

6 次查看(过去 30 天)
Hi everyone,
suppose I have a matrix:
a = [3;
1;
4;
2]
Then I want it to be:
b = [0 0 1 0;
1 0 0 0;
0 0 0 1;
0 1 0 0]
Explanation of first row in matrix "b" (how it's created, manual):
if a(1)=1
b(1,1)=1
elseif b(1,1)=0
end
if a(1)=2
b(1,2)=1
elseif b(1,2)=0
end
if a(1)=3
b(1,3)=1
elseif b(1,3)=0
end
if a(1)=4
b(1,4)=4
elseif b(1,4)=0
end
and so on for rows 2,3 and 4 in matrix a.
I'm looking for a automatic loop or function in the Matlab, because real size of matrix a is 1000 rows.
Please help me, Thanks.

采纳的回答

Geoff Hayes
Geoff Hayes 2014-4-25
Hi Mohammed,
Why not just use a simple loop?
r=size(a,1); % get the number of rows in a (first dimension,1)
b=zeros(r,r); % initialize the b matrix to all zeros
for i=1:r
b(i,a(i))=1; % set the ith row of b with the a(i) column set to one
end
Geoff
  5 个评论
Geoff Hayes
Geoff Hayes 2014-4-25
Hi Mohammed,
So this isn't much different from before - your b now has 8 rows (since a has 4 rows) and all rows of b are paired. The first row of a either populates row 1 or row 2 of b, the second row of a populates either row 3 or row 4 of b, etc. with the ith row of a populating either row 2i-1 or 2i of b:
for i=1:r
if a(i,2)==1
b(2*i-1,a(i,1))=1;
else
b(2*i,a(i,1))=1;
end
end
That should do it!
Geoff

请先登录,再进行评论。

更多回答(1 个)

Jos (10584)
Jos (10584) 2014-4-25
No need for for-loops. This shows the power of linear indexing:
a = [3 1 4 2] % these specify column indices
b = zeros(numel(a), max(a))
idx = sub2ind(size(b), 1:numel(a), a(:).') % linear indices
b(idx) = 1
As for your second question:
a = [3 2; 1 1; 4 2; 2 1]
b = zeros(2*size(a,1), max(a(:,1)))
colix = a(:,1).'
rowix = 2*(1:size(a,1)) - (a(:,2)==1).'
idx = sub2ind(size(b), rowix, colix)
b(idx) = 1

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by