Info

This question is locked. Riaprila per modificarla o per rispondere.

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

76 visualizzazioni (ultimi 30 giorni)
Suraj Tawde il 20 Apr 2019
Locked: DGM il 4 Lug 2024
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
##### 23 CommentiMostra 21 commenti meno recentiNascondi 21 commenti meno recenti
Walter Roberson il 9 Nov 2023
Locking threads is something that Mathworks is working on, but it isn't available yet.
It will likely take the form of requiring a minimum reputation to add to soft-locked Questions.
DGM il 9 Nov 2023
Modificato: DGM il 9 Nov 2023
All we can really do is post a notice clarifying that duplicates will be subject to deletion, and then manually follow up on it whenever new activity occurs. That's what I mean when I say "soft lock". Sort of like:
It helps to have the thread cleaned and cataloged enough to be able to summarize the forms that have already been exhausted. Rik's comment on that question makes it easier for the reader to grasp the scope of the whole thread, and it also makes it easier to moderate it when the rules are clearly stated and a summary is available.
Of course, that would require cleaning up and summarizing all these sprawling threads, in many of which the repeated patterns aren't as easy to distinguish. It makes it all the more time consuming when the volume of content make the page laggy. When the answers are large, it makes comparison all the more tedious. One thread I don't even want to deal with is this one:
I've tried a number of ideas to steamline the cleanup task, but if I'm honest, I don't really have a good way. After an hour or three staring at piles of slightly embellished variations with vague timestamps, I tend to start losing perspective and patience and it's hard for me to feel confident that I'm being fair.
Even without a full cleanup and formal notice, there's no reason we can't check new posts as they arrive on duplicate-prone types of threads. I tend to just keep an eye out for old threads that get bumped. It helps catch traffic on these sorts of homework//onramp/coursera threads, but it also catches the cases where people try burying their questions where they don't belong.

### Risposte (30)

stanleo il 7 Lug 2019
%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 CommentiMostra 4 commenti meno recentiNascondi 4 commenti meno recenti
Rik il 29 Ago 2020
There are several complete solutions on this page. What have you tried so far to piece together what every part means?
Walter Roberson il 29 Ago 2020
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 il 28 Mag 2019
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
##### 4 CommentiMostra 2 commenti meno recentiNascondi 2 commenti meno recenti
Kaushik Hariharan il 13 Feb 2024
Modificato: Kaushik Hariharan il 13 Feb 2024
Could anyone explain why q=S(2)-2 = 2? I would have thought it was zero since S is size of incell which is 1*4. And s(2) could either be the 2nd index value. I am not sure how it is 4-2.
for the while loop, why are we calling q+2? and then doing q=q-1? in Incell isn;t there two values of q+2 = 4 for the first test case and if we do that we would skip the first 3-element vector. When I tried this code, I saw that it chaged 1,2 first to value of 3 then when down to 2,2 then changed the value of -3. I am trying to understand the process matlab code is taking, perhaps understanding the when s(2) = 4 would probably explain more.
DGM il 14 Feb 2024
There's an offset of 2 because the first two elements of the cell array store the size of the original numeric array and the fill value.
The reason that q is decremented from S(2)-2 to zero is because whoever wrote this chose to use a while loop and count backwards instead of just using a for loop.

Pavel Radko il 13 Ago 2020
Modificato: Pavel Radko il 13 Ago 2020
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
##### 3 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
working for the example given in the problem but others no thanks for sharing
manish Singh il 18 Giu 2021
You wrote down the complex code into very simple manner and it do work for any problem. And I understand it very well
Thanks man,

Abhishek singh il 24 Apr 2019
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 CommentiMostra NessunoNascondi Nessuno
Abhishek singh il 24 Apr 2019
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 il 24 Apr 2019
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.

Jaimin Motavar il 30 Giu 2019
Modificato: Jaimin Motavar il 30 Giu 2019
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 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Litesh Ghute il 20 Mar 2020
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 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Walter Roberson il 21 Mar 2020
You did not use the default value for the matrix.

ABINAND PANDIYAN il 23 Apr 2020
Modificato: ABINAND PANDIYAN il 23 Apr 2020
%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 CommentiMostra 2 commenti meno recentiNascondi 2 commenti meno recenti
Priya Dwivedi il 18 Mag 2020
Bt ans coming is incorrect
thank you so much!
it is working just one suggestion for using the variable len
len = length(cellvec);
for i = i= 3:len
...
......
end

% 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 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Amith Anoop Kumar il 26 Giu 2020
can you just expalin me the for loop 1:z(1,1)

Priyansh Kushwaha il 16 Mag 2020
Modificato: Priyansh Kushwaha il 17 Mag 2020
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 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Priyansh Kushwaha il 17 Mag 2020
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 il 17 Mag 2020
but there is semicolon so it is not going to display anything.

utkarsh singh il 21 Mag 2020
Modificato: utkarsh singh il 21 Mag 2020
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 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Taif Ahmed BIpul il 24 Mag 2020
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 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Chandrashekar Upadhya b r il 28 Giu 2020

Thank u It was very simple

Ahmed Mamdouh il 7 Giu 2020
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 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Shikha Thapa il 13 Giu 2020
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 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Shikha Thapa il 13 Giu 2020
You can get help from the answer and code your own logic accordingly!!

Kumar Shubham il 12 Lug 2020
Modificato: Kumar Shubham il 12 Lug 2020
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 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Walter Roberson il 12 Lug 2020
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 il 1 Ago 2020
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 CommentiMostra NessunoNascondi Nessuno
Ishani Uthpala il 1 Ago 2020
I think this will helpfull for you
Walter Roberson il 1 Ago 2020
What is the purpose of your line
x=x+1;
??
What is the purpose of your line
matrix;
??

sushmanth pulavarthi il 3 Ago 2020
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 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

A.H.M.Shahidul Islam il 6 Ago 2020
% 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 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Rik il 6 Ago 2020
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 il 9 Set 2020
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 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Walter Roberson il 9 Set 2020
What is your reason for treating len == 3 differently ?

Mukul Rai il 22 Ott 2020
Modificato: Mukul Rai il 22 Ott 2020
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 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Abdul Quadir Khan il 6 Nov 2020
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 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

zehra ülgen il 12 Nov 2020
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 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Alberto Gil il 29 Dic 2020
Modificato: Alberto Gil il 29 Dic 2020
Hello people,
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 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Walter Roberson il 30 Dic 2020
The question does not seem to require that you verify that the input is a cell.

xin yi leow il 19 Gen 2021
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 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Rik il 19 Gen 2021
What does this answer add? What does it teach? Why should it not be deleted?

Minh Nguyen il 27 Mar 2021
Modificato: Minh Nguyen il 27 Mar 2021
function matrix = sparse2matrix(ABC)
r = ABC{1}(1);
c = ABC{1}(2);
B = zeros(r,c); %make a zero matrix
B(1:end) = ABC{2}; % the sparse matrix with the second element
for i = 3:length(ABC) % and adding
a1 = ABC{i}(1,1);
a2 = ABC{i}(1,2);
B(a1,a2) = ABC{i}(1,3);
end
matrix = B;
end
##### 0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Blaze Shah il 13 Set 2021
Modificato: Walter Roberson il 13 Set 2021
function matrix = sparse2matrix(cellvec)
jj = cell2mat(cellvec);
m = jj(3)*ones(jj(1,[1,2]));
n = 4;
while n<=length(jj)
m(jj(n),jj(n+1)) = jj(n+2);
n = n+3;
end
matrix = m;
##### 0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Sumanth Bayya il 19 Ott 2021
Modificato: Sumanth Bayya il 19 Ott 2021
function M = sparse2matrix(cellvec)
sz = cellvec{1};
val = cellvec{2};
M = val*ones(sz);
for i = 3:length(cellvec)
el = cellvec{i};
M(el(1), el(2)) = el(3);
end
end
##### 0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Ujwal Dhakal il 7 Gen 2022
function matrix = sparse2matrix (cellvec)
[a b] = size(cellvec);% stores the number of cell elements in b whereas a is always 1 as cellvec is a vector
a = cellvec{1,1};% is size of the matrix that loads into a vector a
default_element=cellvec{1,2};
%preallocating the matrix to be of size m*n with all elements default
for i=1:a(1)%a(1) is the no of rows in the matrix
for j=1:a(2) %a(2) is the no of columns in the matrix
matrix(i,j)=cellvec{1,2};
end
end%matrix is generated with all elements set to default value
for ii=3:b%this loop runs from 3 to no of elements in cell vec
matrix(cellvec{1,ii}(1,1),cellvec{1,ii}(1,2))=cellvec{1,ii}(1,3);
end
##### 0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

function matrix=sparse2matrix(cellvec)
matrix=cellvec{2}*ones(cellvec{1,1});
for ii=3:length(cellvec)
matrix(cellvec{ii}(1),cellvec{ii}(2))=cellvec{ii}(3);
end
##### 0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

abdul kabeer il 14 Giu 2023
I solve it this way but dont know if this can be any shorter:
function [matrix]=sparse2matrix(v)
matrix = zeros(v{1}(1),v{1}(2))+v{2};
for i = 3:length(v)
matrix(v{i}(1),v{i}(2)) = v{i}(3);
end
##### 0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Chaohua il 3 Lug 2024
function matrix = sparse2matrix(A)
matrix_m = ones(A{1});
matrix_m = A{2} * matrix_m;
for i = 3:length(A)
r = A{i}(1);
c = A{i}(2);
matrix_m(r,c) = A{i}(3);
end
matrix = matrix_m;
##### 0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

This question is locked.

### Categorie

Scopri di più su COM Component Integration in Help Center e File Exchange

### Community Treasure Hunt

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

Start Hunting!

Translated by