2013-08-22 4 views
4

Эта проблема возникла, когда я был answering this question. Он должен быть какой-то глупый ошибка, что я делаю, но я не могу получить то, что ошибка это ...Подзаголовок с ячейками

myMatrix = [22 33; 44 55] 

Возвращает:

>> subsref(myMatrix, struct('type','()','subs',{{[1 2]}}));  

ans = 

    22 44 

При использовании его с клетками:

myCell = {2 3; 4 5} 

Возврат:

>> subsref(myCell,struct('type','{}','subs',{{[1 2]}})); 

ans = 

    2 % WHATTT?? Shouldn't this be 2 and 4 Matlab?? 

subsrefdocumentation, мы видим:

Посмотрите, как MATLAB вызывает subsref для выражения:

A {1: 2} Синтаксис A {1: 2} вызывает В = subsref (A, S), где S .type = '{}' и S.subs = {[1 2]}.

Это, похоже, не так, потому что возвращаемое значение subsref является только первым аргументом, а не всеми аргументами.

Тогда, если один делает:

>> [a,b]=subsref(myCell,struct('type','{}','subs',{{[1 2]}})) 

a = 

    2 


b = 

    4 % Surprise! 

Но это не то же самое, как myCell {[2 4]}, который автоматически возвращается:

>> myCell{[1 2]}            

ans = 

    2 


ans = 

    4 

я должен был бы использовать subsref с одним вывод для каждого индекса, я использую доступ myCell, или я что-то упускаю?

ответ

4

Когда фигурные скобки ({}) используются для индексации cell array, выход comma-separated list. Это неявно вызывает subsref, но поведение немного отличается от его непосредственного вызова.

subsref сам по себе является технически функцией, а список, разделенный запятыми, возвращенный фигурными фигурными скобками, просто ведет себя как varargout в этом случае. Это означает, что вы должны указать подходящий «приемник» для всех желаемых результатов вывода, как и вы, с любой другой функцией, возвращающей несколько параметров, иначе они будут проигнорированы.

+1

Далее я исследовал ваш ответ, который привел к тому, что matlab ведет себя по-разному для методов '.get'. Оба возвращают ячейку, но при использовании методов '.get' они автоматически расширяют их до списков, разделенных запятыми. Единственная проблема заключается только в том, что 'subsref' оставляет это чувство, что оно также должно вести себя как метод' .get'. – Werner

1

не прошу меня, почему, это как раз то, что я пробовал:

myOutput=subsref(myCell,struct('type','()','subs',{{[1 2]}})) 

Отметьте 'тип', '()'!

это дает мне:

myOutput = 

[2] [4] 

с myOutput в клетке. Преобразование обратно:

>> myOutput=cell2mat(subsref(myCell,struct('type','()','subs',{{[1 2]}}))) 

myOutput = 

2  4 

Это просто «быстрый» ответ, что потребуется некоторые улучшения или вводную-инфо, а ...

+0

Ну, '()' вернет сами ячейки, хороший подход x) – Werner

+0

это действительно ожидается, поскольку для массива ячеек 'A',' out = A ([1 2]) 'возвращает одну переменную который является самим массивом ячеек. В то время как 'out = A {[1 2]}' возвращает список, разделенный запятыми, как объясняет Eitan, и с nargout == 1 мы записываем только первое значение. – Amro

1

Я продолжал расследование @EitanH ответа и смог найти более подробную информацию.

Да, он возвращает список разделенных запятыми, но функция subsref должна возвращать список разделенных запятыми только A{:}. Вот пример, где функции ведут себя по-разному, но это ожидаемое поведение. Я хотел бы, чтобы метод класса .get возвращал список и одну общую функцию класса, чтобы вести себя как общие функции, получая только первый аргумент из ячейки.

classdef ListReturn 

    properties(Access = private) 
    a 
    end 

    properties(Dependent) 
    getA 
    end 

    methods 
    function self = ListReturn(a) 
     self.a = a; 
    end 
    function varargout = get.getA(self) 
     varargout = {self.a}; 
    end 
    function varargout = getAFcn(self) 
     varargout = {self.a}; 
    end 
    end 
end 

Существует существенная разница при вызове функции, точно так, как .get:

k=[ListReturn(2) ListReturn(3) ListReturn(4) ListReturn(5)] 
>> k.getAFcn 

ans = 

    2 

>> k.getA 

ans = 

    2 


ans = 

    3 


ans = 

    4 


ans = 

    5 

Так что, похоже, что с помощью A{1:2} или A{:} работает как Cell.get(), в то время как subsref работает как общий функция matlab, возвращающая только один аргумент, когда выходные аргументы не указаны, как это сделала бы одна функция в C,java,C++. Во всяком случае, я просто чувствую, что subsref должен работать как .get.

Смежные вопросы