#matlab
Вопрос:
Я хочу преобразовать n целых чисел в основание b и записать каждую цифру в виде одного числа в матрицу.
Я получаю базовое представление b с:
stringBaseB=dec2base(0:1:1000,b,10)
но не знаю, как разделить каждую строку на один символ
[[0,0,0,0];[0,0,0,1];[0,0,0,2];...]
Я могу использовать array2table для разделения отдельных символов:
tableBaseB=array2table(dec2base(stringBaseB,b,10))
но это не числовая матрица. Кроме того, в базе b>10 я получаю буквенно-цифровые символы, которые мне нужно преобразовать в числовые с помощью эквивалентности, такой как
alphanumeric=["1","A","c","3"]
numericEquivalence=[1,1 i,-3,0]
Есть ли векторизованный способ сделать это?
Ответ №1:
Для некоторой базы b < 11
, где массив символов dec2base
всегда будет состоять из однозначных цифровых символов, вы можете просто сделать
b = arrayfun( @str2double, stringBaseB );
Для какой-то общей базы b
вы можете создать карту между символами и значениями (вашими numericEquivalence
)
charMap = containers.Map( {'1','2','3'}, {1,2,3} );
Затем вы можете использовать arrayfun
(не строго «векторизованный», как вы просили, но непонятно, почему это требование)
stringBaseB=dec2base(0:1:1000,b,10);
b = arrayfun( @(x)charMap(x), stringBaseB );
Это дает вам числовой выходной массив, например stringBaseB=dec2base(0:5,3,10)
, дает
stringBaseB =
6×10 char array
'0000000000'
'0000000001'
'0000000002'
'0000000010'
'0000000011'
'0000000012'
b =
6x10 double array
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 1 2
Комментарии:
1. Я принял решение, используя для…конца, но это невыносимо медленно. Я прошу векторизованный, потому что я читал, что векторизованный всегда быстрее.