2011-05-26 8 views
3

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

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

ответ

1

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

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

В приведенном выше, A - это вектор, который у вас есть.

0

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

+0

Я не хочу проверять записи U один за другим, искать хэш-карту и затем генерировать V. Ищет функцию вектора/массива в matlab, которая выполняет требование в одиночном режиме. – Learner

-1

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

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

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

Edit: решение

gnovice является гораздо выше. См. Выше.

+0

Что делать, если было 10 записей? Вы действительно не можете войти в все 10, верно? –

1

Создание anonymous function для преобразования одного элемента к нужному выходу, а затем использовать 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' 
1

Я думаю, самый простой подход заключается в создании матрицы ячеек «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 быть одна строка символов, а не массив ячеек строк, вы ок n сделайте это вместо этого:

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

V = 

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