2015-06-29 2 views
0

Представьте Я массив пустой ячейки, как это:Выбор элементов ячейки с использованием логической матрицы

dim = [100,200]; 

x = cell(dim); 

И я хочу, чтобы заменить диагональные элементы x с 'a' (строкой). Это то, что я сделал:

mask = logical(eye(dim)); 
x{mask} = {'a'}; 

Однако, я получаю следующее сообщение об ошибке:

The right hand side of this assignment has too few values to satisfy the left hand side

Error in test (line 28)

x{mask} = {'a'};

Я также попытался:

mask_2 = find(mask == true); 
x{mask_2} = {'a'}; 

Но я получаю ту же ошибку. Есть ли способ решить это? Я хочу, чтобы сценарий был максимально эффективным.

ответ

4

Есть два способа, которые я знаю для этого.

Первый заключается в использовании адресации с круглыми скобками вместо скобок. Это возвращает ссылку на массив ячейки для каждого адреса, поэтому вы должны назначить массив ячеек в результате:

x(mask) = {'a'}; 

Второй использовать кронштейн адресацию, которая будет возвращать список разделенных запятыми. Что это? Вы никогда не слышали о comma-separated list в Matlab? Это потому, что это наименее понятный тип данных Matlab, хотя я уверяю вас, что вы видели его раньше. Прочтите ссылку для получения дополнительной информации. Я обнаружил, что многие «странности» Матлаба имели больше смысла, когда я понял, что такое список, разделенный запятыми, и где они используются.

В любом случае, если вы попытались написать x{mask} = 'a', это не сработает, потому что вы пытаетесь присвоить одно значение списку ссылок, разделенным запятыми. Вы можете использовать функцию deal для назначения каждой ссылки с помощью некоторой сообразительности, чтобы сцепить ссылки:

[x{mask}] = deal('a'); 

И там у вас есть. Два способа назначения массиву ячеек с использованием логических индексов. Я не уверен, что быстрее, вам придется проверить это самостоятельно.

+0

x (маска) отлично работает. Спасибо. – mat

+0

Очень хороший ответ. Я не думаю, что список, разделенный запятыми, можно строго рассматривать как тип данных. Но вы абсолютно правы, что многие «странности» Матлаба имеют больше смысла, когда вы понимаете, что такое список, разделенный запятой, и где они используются. –

4

Для обозначения набора ячеек, использовать то, что документация Matlab называет «гладкие круглые скобки», или то, что мы называем просто нормальные круглые скобки:

http://www.mathworks.com/help/matlab/matlab_prog/access-data-in-a-cell-array.html

x(mask) = {'a'} 

результаты dim = [5,6]:

x = 
{ 
    [1,1] = a 
    [2,1] = [](0x0) 
    [3,1] = [](0x0) 
    [4,1] = [](0x0) 
    [5,1] = [](0x0) 
    [1,2] = [](0x0) 
    [2,2] = a 
    [3,2] = [](0x0) 
    [4,2] = [](0x0) 
    [5,2] = [](0x0) 
    [1,3] = [](0x0) 
    [2,3] = [](0x0) 
    [3,3] = a 
    [4,3] = [](0x0) 
    [5,3] = [](0x0) 
    [1,4] = [](0x0) 
    [2,4] = [](0x0) 
    [3,4] = [](0x0) 
    [4,4] = a 
    [5,4] = [](0x0) 
    [1,5] = [](0x0) 
    [2,5] = [](0x0) 
    [3,5] = [](0x0) 
    [4,5] = [](0x0) 
    [5,5] = a 
    [1,6] = [](0x0) 
    [2,6] = [](0x0) 
    [3,6] = [](0x0) 
    [4,6] = [](0x0) 
    [5,6] = [](0x0) 
} 
+0

Я создал чат-комнату MATLAB для обсуждения вопросов, связанных с MATLAB, или для обсуждений, выходящих за рамки ограничений одного комментария. Приходите к нам, когда у вас есть время! - http://chat.stackoverflow.com/rooms/81987/matlab – rayryeng

1

В дополнение к разъяснениям, вы также можете избежать создания (потенциально большой) логический массив, если это его единственная цель, и использовать linear indexing присвоить значения непосредственно с помощью sub2ind функции:

dim = [100,200]; 
x = cell(dim); 
x(sub2ind(dim,1:dim(1),1:dim(1))) = {'a'}; 

Как уже упоминалось в комментариях, функция sub2ind проста здесь, так как шаг между диагональными элементами является постоянным значением (количество строк).Таким образом, выше может быть упрощено до

x(1:dim(1)+1:dim(1)^2) = {'a'}; 
+0

Или «x (1: dim (1) +1: dim (1) * dim (2)) = {'a'} ' – beaker

+0

В этом случае очень легко обойти« sub2ind »:' x (1: size (x) +1: end) = {'a'} ' –

+0

@beaker Хорошо сказано :-D –

1

другой вариант (один лайнер, мои любимые решения), используя логику, которая была представлена ​​в этом вопросе (eye функции и т.д.):

x=num2cell(char(eye(n,m)*97),n) 

где dim=[n,m], и 97 будет кодироваться для строки 'a' ...

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