MATLAB Answers

I get an error, what's wrong? on Sparse matrix logic and answer

349 ビュー (過去 30 日間)
Suraj Tawde
Suraj Tawde 2019 年 4 月 20 日
コメント済み: Rik 2021 年 1 月 19 日
Write the function for
A sparse matrix is a large matrix with almost all elements of the same value (typically zero). The normal representation of a sparse matrix takes up lots of memory when the useful information can be captured with much less. A possible way to represent a sparse matrix is with a cell vector whose first element is a 2-element vector representing the size of the sparse matrix. The second element is a scalar specifying the default value of the sparse matrix. Each successive element of the cell vector is a 3-element vector representing one element of the sparse matrix that has a value other than the default. The three elements are the row index, the column index and the actual value. Write a function called "sparse2matrix" that takes a single input of a cell vector as defined above and returns the output argument called "matrix", the matrix in its traditional form. Consider the following run:
cellvec = {[2 3], 0, [1 2 3], [2 2 -3]};
matrix = sparse2matrix(cellvec)
matrix =
0 3 0
0 -3 0

  15 件のコメント

表示 12 件の古いコメント
Walter Roberson
Walter Roberson 2020 年 5 月 18 日
Is cellvec{1,2} is equivalent to cellvec{2}
cellvec{2} is an example of what MATLAB calls "linear indexing". When you use a single index into an array, then MATLAB starts counting from the beginning of the array, using the order of the elements as stored in memory .
MATLAB stores elements in "column major order", https://en.wikipedia.org/wiki/Row-_and_column-major_order which means that elements in the same column are beside each other in memory. For example for A=[1 2 3; 4 5 6; 7 8 9], the order in memory is
1 %A(1,1)
4 %A(2,1)
7 %A(3,1)
2 %A(1,2)
5 %A(2,2)
8 %A(3,2)
3 %A(1,3)
6 %A(2,3)
9 %A(3,3)
The row number varies most quickly, then the column number.
It happens that if you have a vector of values, that the ordering turns out the same in memory:
Brow = [8 5 4]
8 %Brow(1,1)
5 %Brow(2,1)
4 %Brow(3,1)
Bcol = [8; 5; 4]
8 %Brow(1,1)
5 %Brow(1,2)
4 %Brow(1,3)
So if you know something is a vector, you do not need to know whether it is a row vector or column vector if you just use a single index into it.
Walter Roberson
Walter Roberson 2020 年 5 月 18 日
You cannot make a Matrix using Zeros function
You can if you add the base value to the matrix of zeros()
matrix = cellvec{2} + zeros(cellvec{1});
Lokesh Sahu
Lokesh Sahu 2020 年 9 月 1 日
function matrix = sparse2matrix (cellvec)
m = cellvec{1}(1,1);
n = cellvec{1}(1,2);
defult = ones(m,n) .* cellvec{1,2};
for i= 3:length(cellvec)
r1 = cellvec{i}(1,1);
c1 = cellvec{i}(1,2);
defult(r1,c1) = cellvec{i}(1,3);
end
matrix = defult;
end

サインインしてコメントする。

回答 (23 件)

stanleo
stanleo 2019 年 7 月 7 日
%simple version
function matrix = sparse2matrix(cellvec)
matrix = cellvec{2}*ones(cellvec{1});
for m=3:size(cellvec,2)
matrix(cellvec{m}(1),cellvec{m}(2))=cellvec{m}(3);
end

  6 件のコメント

表示 3 件の古いコメント
Bhoomika Manjunatha
Bhoomika Manjunatha 2020 年 8 月 29 日
can someone pls explain the entire code.
Rik
Rik 2020 年 8 月 29 日
There are several complete solutions on this page. What have you tried so far to piece together what every part means?
Walter Roberson
Walter Roberson 2020 年 8 月 29 日
Bhoomika:
We do not have any idea what your level of experience in programming is. We would have to start from the basics of mathematics and computer science to explain the entire code in a way that we could relatively sure you would understand. That would take at least two textbooks of explanation. None of us has time to write all that.
We suggest you ask more specific questions that can be more easily answered.

サインインしてコメントする。


AYUSH GURTU
AYUSH GURTU 2019 年 5 月 28 日
function [matrix]=sparse2matrix(incell)
S=size(incell);
q=S(2)-2;
msize=incell{1};
mdef=incell{2};
matrix=repmat(mdef,msize);
while q>0
matrix(incell{q+2}(1), incell{q+2}(2)) = incell{q+2}(3);
q = q-1;
end

  2 件のコメント

Sarthak Swain
Sarthak Swain 2020 年 8 月 25 日
perfect
THIERNO AMADOU MOUCTAR BALDE
THIERNO AMADOU MOUCTAR BALDE 2020 年 12 月 29 日
perfect thank you sir

サインインしてコメントする。


Pavel Radko
Pavel Radko 2020 年 8 月 13 日
編集済み: Pavel Radko 2020 年 8 月 13 日
Passed all tests solution. May be not the best one (because I have no idea how to biuld default matrix in easier way), but works 100%.
% Build a matrix called "matrix" using instrictions of input "cellvec"
function matrix = sparse2matrix(cellvec)
% first we build a default matrix with size ii*jj
% we use 1st element of "cellvec" to get the size of matrix
for ii = 1:cellvec{1}(1,1)
for jj = 1:cellvec{1}(1,2)
% all elements of matrix equals to the 2nd element of "cellvec"
matrix(ii,jj) = cellvec{2};
end
end
% now we need to change elements of our default matrix
% instructions for place and value of this elements comes in "cellvec"
% from 3rd element till the end of "cellvec"
for zz = 3:length(cellvec)
% we call "matrix" elements and assign values to them from every 3rd element of subarrays of "cellvec"
matrix(cellvec{zz}(1,1),cellvec{zz}(1,2)) = cellvec{zz}(1,3);
end
end

  2 件のコメント

dina mohamed
dina mohamed 2020 年 12 月 27 日
thanks a lot
THIERNO AMADOU MOUCTAR BALDE
THIERNO AMADOU MOUCTAR BALDE 2020 年 12 月 29 日
working for the example given in the problem but others no thanks for sharing

サインインしてコメントする。


Abhishek singh
Abhishek singh 2019 年 4 月 24 日
function [matrix]= sparse2matrix(incell);
X=size(incell);
q=X(2)-2;
msize=incell{1};
mdef=incell{2};
matrix=repmat(mdef,msize);
while q > 0
matrix(incell{q+2}(1), incell{q+2}(2)) = incell{q+2}(3);
break
end
output
matrix =
0 0 0
0 -3 0
required output
matrix =
0 3 0
0 -3 0

  2 件のコメント

Abhishek singh
Abhishek singh 2019 年 4 月 24 日
# added q+1
function [matrix]= sparse2matrix(incell);
X=size(incell);
q=X(2)-2;
msize=incell{1};
mdef=incell{2};
matrix=repmat(mdef,msize);
while q > 0
matrix(incell{q+1}(1), incell{q+1}(2)) = incell{q+1}(3);
matrix(incell{q+2}(1), incell{q+2}(2)) = incell{q+2}(3);
break
end
matrix =
0 3 0
0 -3 0
but failed for
ariable solution has an incorrect value.
sparse2matrix( { [ 9 12 ], 3, [ 6 2 6 ], [ 7 1 -6 ], [ 1 10 -7 ], [ 2 2 -3 ], [ 1 4 -8 ], [ 1 11 -8 ], [ 9 11 -8 ], [ 7 8 5 ], [ 9 8 4 ], [ 9 11 7 ], [ 5 9 -4 ], [ 8 12 8 ], [ 3 6 5 ] } ) failed...
Walter Roberson
Walter Roberson 2019 年 4 月 24 日
Why are you using break after one iteration of the loop ? If you are only going to do a set of instructions once, do not bother to put it in a loop.
I suggest that you read about for loops.

サインインしてコメントする。


Jaimin Motavar
Jaimin Motavar 2019 年 6 月 30 日
編集済み: Jaimin Motavar 2019 年 6 月 30 日
can you tell me what is wrong in this answer?
function matrix = sparse2matrix(a)
e=length(a);
b=rand(a{1,1});
[m,n]=size(b);
c=a{1,3};
d=a{1,4};
for i=1:m
for j=1:n
b(i,j)=a{1,2};
end
end
for g=3:e
for f=(g-2):(e-2)
p(1,f)=a{1,g}(1,1);
end
end
for g=3:e
for f=(g-2):(e-2)
q(1,f)=a{1,g}(1,2);
end
end
for g=3:e
for f=(g-2):(e-2)
r(1,f)=a{1,g}(1,3);
end
end
for o=1:(e-2)
b(p(o),q(o))=r(o);
end
matrix=b;
end

  0 件のコメント

サインインしてコメントする。


Litesh Ghute
Litesh Ghute 2020 年 3 月 20 日
What's wrong with my code ?
function matrix= sparse2matrix(v)
mat=zeros([v{1}(1),v{1}(2)]);
r=size(mat);
m=3;
while m <= 4
i=v{m}(1);
j=v{m}(2);
mat(v{m}(i,j))=v{m}(3);
m=m+1;
end
matrix=mat;
end

  1 件のコメント

Walter Roberson
Walter Roberson 2020 年 3 月 21 日
You did not use the default value for the matrix.

サインインしてコメントする。


ABINAND PANDIYAN
ABINAND PANDIYAN 2020 年 4 月 23 日
編集済み: ABINAND PANDIYAN 2020 年 4 月 23 日
%All the test cases are right. try this
function matrix= sparse2matrix(cellvec)
a= cellvec{1};
row=a(1);
column=a(2);
main_value= cellvec{2};
sparse_matrix= main_value * ones(row, column);
len= length(cellvec);
for i= 3:length(cellvec)
change = cellvec{i};
r=change(1);
c=change(2);
m=change(3);
sparse_matrix(r,c)=m;
end
matrix=sparse_matrix;
end

  4 件のコメント

表示 1 件の古いコメント
Kilaru Venkata Krishna
Kilaru Venkata Krishna 2020 年 5 月 16 日
Thanks for this which made understand easily.
Priya  Dwivedi
Priya Dwivedi 2020 年 5 月 18 日
Bt ans coming is incorrect
THIERNO AMADOU MOUCTAR BALDE
THIERNO AMADOU MOUCTAR BALDE 2020 年 12 月 29 日
thank you so much!
it is working just one suggestion for using the variable len
len = length(cellvec);
for i = i= 3:len
...
......
end

サインインしてコメントする。


SAMARTH MAHESHKUMAR GEMLAWALA
SAMARTH MAHESHKUMAR GEMLAWALA 2020 年 5 月 15 日
% Compteled all the test cases successfully.
function matrix = sparse2matrix(a)
cellvec = a
p= size(cellvec)
z = cellvec{1,1}
x = cellvec{1,2}
matrix = zeros(z(1,1),z(1,2));
for i=1:z(1,1)
for j= 1:z(1,2)
matrix(i,j) = x;
end
end
for j= 3: p(1,2)
y = cellvec{1,j}
matrix(y(1,1),y(1,2)) = y(1,3);
end

  1 件のコメント

Amith Anoop Kumar
Amith Anoop Kumar 2020 年 6 月 26 日
can you just expalin me the for loop 1:z(1,1)

サインインしてコメントする。


Priyansh Kushwaha
Priyansh Kushwaha 2020 年 5 月 16 日
編集済み: Priyansh Kushwaha 2020 年 5 月 17 日
function matrix=sparse2matrix(a)
b=a{1,1}
b1=b(1,1);
b2=b(1,2);
e=ones(b1,b2);
b=a{1,2}
e=b.*(e);
for i=3:length(a)
c=a{1,i};
d1=c(1,1);
d2=c(1,2);
d3=c(1,3);
e(d1,d2)=d3;
matrix=e;
end
matrix=e;
end

  3 件のコメント

Walter Roberson
Walter Roberson 2020 年 5 月 17 日
matrix=e;
You overwrite matrix after the loop, so there is no point in doing that assignment inside the loop.
Priyansh Kushwaha
Priyansh Kushwaha 2020 年 5 月 17 日
When there are less element in the 'a' (less than 3), So ''matrix=e'' assignment is helpful to display the output/ assigning value because in this condition(length(a)<3) the loop does not initiate.
Walter Roberson
Walter Roberson 2020 年 5 月 17 日
but there is semicolon so it is not going to display anything.

サインインしてコメントする。


utkarsh singh
utkarsh singh 2020 年 5 月 21 日
編集済み: utkarsh singh 2020 年 5 月 21 日
function matrix=sparse2matrix(a)
row=a{1,1}(1,1);
col=a{1,1}(1,2);
default=a{1,2}; % or simply default=a{1,2}
matrix=ones(row,col)*default; % matrix=ones(a{1})*deafult.....no need of finding row and col
for m=3:length(a)
matrix(a{m}(1,1),a{m}(1,2))=a{m}(1,3);
end

  0 件のコメント

サインインしてコメントする。


Taif Ahmed BIpul
Taif Ahmed BIpul 2020 年 5 月 24 日
function matrix=sparse2matrix(cellvec)
m=ones(cellvec{1}(1),cellvec{1}(2));
m=m.*cellvec{2};
for i=3:length(cellvec)
m(cellvec{i}(1),cellvec{i}(2))=cellvec{i}(3);
end
matrix=m;

  1 件のコメント

Chandrashekar Upadhya b r
Chandrashekar Upadhya b r 2020 年 6 月 28 日

Thank u It was very simple

サインインしてコメントする。


ahmed mamdouh
ahmed mamdouh 2020 年 6 月 7 日
function matrix = sparse2matrix(ce)
matri=ones(ce{1,1}(1,1),ce{1,1}(1,2))*ce{1,2};
siz=size(ce);
i=siz(1,2);
for ii=3:i
matri( ce{1,ii}(1,1),ce{1,ii}(1,2))=ce{1,ii}(1,3);
end
matrix=matri;

  0 件のコメント

サインインしてコメントする。


Shikha Thapa
Shikha Thapa 2020 年 6 月 13 日
function matrix=sparse2matrix(cellvec)
matrix=cellvec{1,2}*ones([cellvec{1}(1),cellvec{1}(2)]);
for a=3:length(cellvec)
matrix(cellvec{1,a}(1,1), cellvec{1,a}(1,2))=cellvec{1,a}(1,3);
end

  1 件のコメント

Shikha Thapa
Shikha Thapa 2020 年 6 月 13 日
You can get help from the answer and code your own logic accordingly!!

サインインしてコメントする。


Kumar Shubham
Kumar Shubham 2020 年 7 月 12 日
編集済み: Kumar Shubham 2020 年 7 月 12 日
function matrix = sparse2matrix(cellvec)
%creates matrix of req. size.
matrix=zeros(cellvec{1});
%allots assigned scalar value to all elements.
matrix(:)=deal(cellvec{2});
%used loop to maipulate matrix for result.
%use breakpoints to see approach to result step by step .
for ii = 3:length(cellvec)
matrix(cellvec{ii}(1,1),cellvec{ii}(1,2))=cellvec{ii}(1,3);
end

  1 件のコメント

Walter Roberson
Walter Roberson 2020 年 7 月 12 日
Why are you using deal? Are you expecting that cellvec{2} will expand to multiple comma-separated elements? That is not going to happen with a scalar index like {2}
If you are wanting to copy the one value expectd in cellvec{2} to all elements on the left, then you do not need deal() .

サインインしてコメントする。


Ishani Uthpala
Ishani Uthpala 2020 年 8 月 1 日
function matrix=sparse2matrix(v)
matrix=v{1,2}*ones(v{1,1}(1,1),v{1,1}(1,2));
y=length(v);
for x=3:y
matrix(v{1,x}(1,1),v{1,x}(1,2))=v{1,x}(1,3);
x=x+1;
end
matrix;
end

  2 件のコメント

Ishani Uthpala
Ishani Uthpala 2020 年 8 月 1 日
I think this will helpfull for you
Walter Roberson
Walter Roberson 2020 年 8 月 1 日
What is the purpose of your line
x=x+1;
??
What is the purpose of your line
matrix;
??

サインインしてコメントする。


sushmanth pulavarthi
sushmanth pulavarthi 2020 年 8 月 3 日
function matrix=sparse2matrix(v)
rows=v{1,1}(1);columns=v{1,1}(2); %extracting total no.of rows and columns for sprase matrix
magnitude=v{2}; %extracting the default value
m=magnitude*ones(rows,columns);
for i=3:length(v) %creating the loop foor changing the values other than default
r=v{i}(1);
c=v{i}(2);
m(r,c)=v{i}(3);
end
matrix=m;
end
%this works for any no.of elements

  0 件のコメント

サインインしてコメントする。


A.H.M.Shahidul Islam
A.H.M.Shahidul Islam 2020 年 8 月 6 日
% 100% accurate
function matrix=sparse2matrix(m)
m=cell(m);
r=m{1}(1);c=m{1}(2);dv=m{2};
ss=size(m);
matrix=sparse(r,c)+dv;
q=ss(1,2);
for ii=3:q
matrix(m{ii}(1),m{ii}(2))=m{ii}(3);
end

  1 件のコメント

Rik
Rik 2020 年 8 月 6 日
Thanks, now I can cheat on my homework without having to bother understanding the problem or the solution.
On a slightly more serious note: you forgot the closing end. Although you don't need it, it has become a lot more common, especially since it is possible to put functions in script files.

サインインしてコメントする。


Ali Raza
Ali Raza 2020 年 9 月 9 日
function matrix = sparse2matrix(x)
M = x{1};
m = ones(M(1),M(2)) * x{2};
[~,len] = size(x);
if len == 3
i = 3;
m(x{i}(1),x{i}(2)) = x{i}(3);
else
for i = 3:len
m(x{i}(1),x{i}(2)) = x{i}(3);
end
end
matrix = m;
end

  1 件のコメント

Walter Roberson
Walter Roberson 2020 年 9 月 9 日
What is your reason for treating len == 3 differently ?

サインインしてコメントする。


Mukul Rai
Mukul Rai 2020 年 10 月 22 日
編集済み: Mukul Rai 2020 年 10 月 22 日
function matrix = sparse2matrix(a)
asize=length(a);
r = a{1}(1,1);
c = a{1}(1,2);
z = zeros(r,c)
z(:)= a{2};
if asize<=2
matrix =z
return
end
for jj=3:asize
r1 = a{jj}(1,1);
c1 = a{jj}(1,2);
n1 = a{jj}(1,3);
z(r1,c1)=n1
end
matrix =z

  0 件のコメント

サインインしてコメントする。


Abdul Quadir Khan
Abdul Quadir Khan 2020 年 11 月 6 日
function matrix = sparse2matrix (cellvec)
m = cellvec{1}(1,1);
n = cellvec{1}(1,2);
defult = ones(m,n) .* cellvec{1,2};
for i= 3:length(cellvec)
r1 = cellvec{i}(1,1);
c1 = cellvec{i}(1,2);
defult(r1,c1) = cellvec{i}(1,3);
end
matrix = defult;
end

  0 件のコメント

サインインしてコメントする。


zehra ülgen
zehra ülgen 2020 年 11 月 12 日
Here is another solution..
function m = sparse2matrix(a)
[t c] = size(a);
m = zeros(a{1,1});
[x y] = size(m);
for ii = 1:x;
for jj = 1:y;
m(ii,jj) = a{1,2};
end
end
for i = 3:c;
v = a(1,i);
m(v{1,1}(1,1),v{1,1}(1,2)) = v{1,1}(1,3);
end

  0 件のコメント

サインインしてコメントする。


Alberto Gil
Alberto Gil 2020 年 12 月 29 日
編集済み: Alberto Gil 2020 年 12 月 29 日
Hello people,
What do you think about this code?
function matrix=sparse2matrix(cll)
if iscell(cll)==1
% Declare values, cs=size of the array; cdn=the nominal value; N=greatest value;
cs=cll{1,1}; cdn=cll{1,2}; N=size(cll,2);
% Create the matrix with the nominal value and the size.
cm=ones(cs)*cdn;
for n=3:N;
cxdn=cll{1,n};
% Select the values of the input values.
cm(cxdn(1,1), cxdn(1,2))=cxdn(1,3);
end
matrix= cm;
else
error('The input must be a cell class');
end
end

  1 件のコメント

Walter Roberson
Walter Roberson 2020 年 12 月 30 日
The question does not seem to require that you verify that the input is a cell.

サインインしてコメントする。


xin yi leow
xin yi leow 2021 年 1 月 19 日
function matrix=sparse2matrix(cellx)
matrix=zeros(cellx{1});
matrix(:,:)=cellx{2};
for ii=3:length(cellx)
num=cellx{ii};
matrix(num(1),num(2))=num(3);
end
end

  1 件のコメント

Rik
Rik 2021 年 1 月 19 日
What does this answer add? What does it teach? Why should it not be deleted?

サインインしてコメントする。

Community Treasure Hunt

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

Start Hunting!

Translated by