Изменить диапазон чисел матрицы
Модератор: Admin
Изменить диапазон чисел матрицы
Скажем дана матрица uint16 с 10-ти битными числами от 0 до 1023. Требуется умножить на 2 числа матрицы от 300 до 600. Остальные числа оставить без изменения. Как это сделать?
Как умножить тот же диапазон чисел на переменный коэффициент, меняющийся линейно от 2 при 300 до 1 при 600?
Как умножить тот же диапазон чисел на переменный коэффициент, меняющийся линейно от 2 при 300 до 1 при 600?
Re: Изменить диапазон чисел матрицы
[quote="tur91"]Скажем дана матрица uint16 с 10-ти битными числами от 0 до 1023. Требуется умножить на 2 числа матрицы от 300 до 600. Остальные числа оставить без изменения. Как это сделать?
A=uint16(round(1023*rand(5)));
B = A;
B(A>=300&A<600)=B(A>=300&A<600)*2
Виталий
A=uint16(round(1023*rand(5)));
B = A;
B(A>=300&A<600)=B(A>=300&A<600)*2
Виталий
tur91 писал(а):Виталий, спасибо.
А как же умножить на линию? На линейно переменный коэффициент.
Например, так:
N1 = 5;
N2 = 4;
A=uint16(round(1023*rand(N1, N2)));
B = A;
B(A>=300&A<600)=B(A>=300&A<600)*2;
C = A;
for k1 = 1 : N1
for k2 = 1 : N2
if A(k1, k2)>=300 & A(k1, k2)<600
k = 2-(1/300)*(double(A(k1, k2)) - 300);
C(k1, k2) = A(k1, k2)* k;
end
end
end
Виталий
Виталий, спасибо, но мне нужно без for.
letete, я не понял что Вы написали, но я думаю как бы в этом же направлении.
Вот гистограмма матрицы
я хочу диапазон от 380 до 680 преобразовать в диапазон от 380 до 1000.
Для этого вычисляем прямую на которую надо умножить исходный диапазон
Тогда пик растянется и сместится вправо, займет диапазон от 380 до 1000.
letete, я не понял что Вы написали, но я думаю как бы в этом же направлении.
Вот гистограмма матрицы

я хочу диапазон от 380 до 680 преобразовать в диапазон от 380 до 1000.
Для этого вычисляем прямую на которую надо умножить исходный диапазон

Тогда пик растянется и сместится вправо, займет диапазон от 380 до 1000.
tur91,
а я вообще ничего не понял))
если мы говорим об умножении в смысле .* (я кстати забыл точку поставить в прошлом посте), то какая вообще разница что на что умножать? Вам всего лишь нужно сотворить массив коэффициентов размером как A(A>300&A<600) , например для одномерного: (1:0.1:2), а для двумерного надо будет учитывать size( A(A>300&A<600) )...
а я вообще ничего не понял))
если мы говорим об умножении в смысле .* (я кстати забыл точку поставить в прошлом посте), то какая вообще разница что на что умножать? Вам всего лишь нужно сотворить массив коэффициентов размером как A(A>300&A<600) , например для одномерного: (1:0.1:2), а для двумерного надо будет учитывать size( A(A>300&A<600) )...
letete, в матрице М на каких то случайных местах стоят числа от 380 до 680, на остальных тоже неизвестных местах стоят числа из диапазонов от 0 до 380 и от 680 до 1023. Числа от 380 до 680 надо умножить на массив чисел. Создаем его х = 380:680; y = 2.07*x - 240;
Если записать матричное умножение так:
M(380 <= M & M <=680) = M(380 <= M & M <=680) .*y;
то получаем: Matrix dimensions must agree.
Так как его записать?
Если записать матричное умножение так:
M(380 <= M & M <=680) = M(380 <= M & M <=680) .*y;
то получаем: Matrix dimensions must agree.
Так как его записать?
tur91 писал(а):letete, в матрице М на каких то случайных местах стоят числа от 380 до 680, на остальных тоже неизвестных местах стоят числа из диапазонов от 0 до 380 и от 680 до 1023. Числа от 380 до 680 надо умножить на массив чисел. Создаем его х = 380:680; y = 2.07*x - 240;
Если записать матричное умножение так:
M(380 <= M & M <=680) = M(380 <= M & M <=680) .*y;
то получаем: Matrix dimensions must agree.
Так как его записать?
Код: Выделить всё
y = @(x)2.07*x - 240;
l0=380 <= M & M <=680;
M(l0) = y(M(l0));
A - массив с числами от 0 до 1023.
или
Код: Выделить всё
[~,~,ii] = unique(A);
out = A.*coef(ii);
Код: Выделить всё
[l,ii] = ismember(A,0:1023);
out = A.*coef(ii(l));