Name-value pairs
22 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Milind Amga
el 2 de Oct. de 2020
Comentada: Chem
el 9 de Dic. de 2021
Can anyone point out the solution to the error shown below (in the end)?
Thank you in advance.
function output = name_value_pairs(varargin)
if nargin == 0 || rem(length(varargin),2) ~= 0
output = {};
return;
end
for i = 1:length(varargin)
if ~ischar(varargin{i})
if ~isdouble(varargin{i}) || isfloat(varargin{i})
output = {};
return;
end
end
end
output = cell(((length(varargin))/2),2);
n =1 ;
for j = 1: (length(varargin))/2
for k = 1:2
output{j,k} = varargin{n};
n = n+1;
end
end
end
0 comentarios
Respuesta aceptada
Ameer Hamza
el 2 de Oct. de 2020
Editada: Ameer Hamza
el 2 de Oct. de 2020
You can use reshape
function C = name_value_pairs(varargin)
if nargin == 0 || rem(numel(varargin),2) ~= 0
C = {};
return;
end
C = reshape(varargin, 2, []).';
if ~all(cellfun(@ischar, C))
C = {}
end
end
6 comentarios
Ameer Hamza
el 19 de Oct. de 2020
.' is just use to change the array shape from row to column. For cell array, both ' and .' are equivalent. For matrix ' means conjucate transpose, and .' means simple transpose.
Chem
el 9 de Dic. de 2021
The code is great, it only has one small bug, when using the line ~all(cellfun(@ischar, C)) it requires all columns to be of type char, however, the problem stated says that only the first column must be of type char, so a convenient change is ~all(cellfun(@ischar, C(:,1))))
Más respuestas (2)
Arthur Roué
el 2 de Oct. de 2020
isdouble is not a MATLAB function. Try this :
isa(YourVar, 'double')
0 comentarios
Steven Lord
el 2 de Oct. de 2020
if ~isdouble(varargin{i}) || isfloat(varargin{i})
Assuming there were an isdouble function doing what you would expect from the name (Arthur Roué is correct, there is no such function in MATLAB though a few objects in various other MathWorks products have methods by that name) what could cause this condition to not pass?
If varargin{i} is a double, the first part of the if condition is false so we need to evaluate the second part. The second part is true so the whole condition is true.
If varargin{i} is a single, the first part of the if condition is true so we don't need to evaluate the second part.
If varargin{i} is an int8, the first part of the if condition is true so we don't need to evaluate the second part.
About the only condition I can think of offhand where this condition could fail would be an object that overloads isdouble and isfloat to return true and false respectively. If someone's willing to go to that length to trick MATLAB, they're likely to encounter other unusual behavior.
0 comentarios
Ver también
Categorías
Más información sobre Matrix Indexing en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!