вектор поиска в Matlab - PullRequest
3 голосов
/ 26 мая 2011

Учитывая вектор U nx 1 , который содержит записи из 0,1,2,3 , я хотел бы создать еще один вектор V в типе символа, так что запись
0 в U будет равна '0' в V
1 в U «1» в V
2 в U будет «12» в V
3 в U будет'123' в V

Какой оптимальный способ сделать в Matlab вместо сканирования каждой отдельной записи в векторе и затем использовать регистр переключателя?

Ответы [ 5 ]

1 голос
/ 26 мая 2011

Вы можете легко определить набор правил и индексировать его.

rules={'0','1','12','123'};
out=rules(A+1)

В приведенном выше примере A - это ваш вектор.

1 голос
/ 26 мая 2011

Я думаю, что самый простой подход - создать массив ячеек 'C', содержащий ваши 4 строковых значения, а затем индексировать массив с помощью U+1:

>> C = {'0' '1' '12' '123'};  %# Cell array with 4 strings corresponding to 0..3
>> U = [0 1 2 3 2 1 0];       %# Sample U vector
>> V = C(U+1)                 %# Index C with U+1

V = 

    '0'    '1'    '12'    '123'    '12'    '1'    '0'

И если вы хотите, чтобы V была строкой из одного символа вместо массива ячеек строк, вы можете сделать это вместо:

>> V = [C{U+1}]

V =

01121231210
1 голос
/ 26 мая 2011

Создайте анонимную функцию для преобразования одного элемента в желаемый вывод и затем используйте ARRAYFUN , чтобы применить эту функцию ко всем входам:

>> f = @(x) sprintf('%u', sum(10.^((x-1):-1:0) .* (1:x)));
>> x = 0:3

x =

     0     1     2     3

>> c = arrayfun(f, x, 'UniformOutput', 0)

c = 

    '0'    '1'    '12'    '123'
0 голосов
/ 26 мая 2011

Вот векторизованная версия, которая является идиоматической Matlab:

Тем не менее, это в действительности делает линейное сканирование 4 раза.Если вы действительно хотите большей эффективности, напишите мекс-функцию C.

V = cell(size(U));
V{U==0} = '0';
V{U==1} = '1';
V{U==2} = '12';
V{U==3} = '123';

Редактировать:

Решение gnovice намного лучше.Смотри выше.

0 голосов
/ 26 мая 2011

Я бы сказал, создайте хэш-карту с набором пар, которые вы там дали. Каждый раз, когда вы хотите вставить в V на основе U, вставьте значение в паре с ключом, который является значением ввода U в V. I. Т.е. если U [0] = 2, тогда выполните V [0] = myMap.get (2) или любой другой синтаксис MATLAB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...