2015-05-13 2 views
0

Поэтому мне нужно сгенерировать матрицу х и у точек, учитывая, что они соответствуют условию, что при этих (х, у) точках концентрация больше 10. Обратите внимание, что я сначала запускаю код, который дает мне концентрацию в каждом месте, и теперь мне нужно, чтобы Matlab «случайно» выбирал (x, y) точки с указанным выше условием.Создание случайного списка точек (x, y), удовлетворяющих условию?

Поблагодарили бы за любые предложения по поводу этого.

ответ

1

предполагая, ваши данные выглядит примерно так:

data= [... x y concentration 
      1, 1, 1; ... 
      2, 1, 11; ... 
      1, 2, 12; ... 
      2, 2, 1 ... 
    ] 

Вы можете найти все концентрации больше, чем 10 с:

data_cbigger10=data(data(:,3)>10,:) % using logical indexing 

и выбрать случайную точку оттуда с:

randomPoint=data_cbigger10(ceil(size(data_cbigger10,2)*rand),:) % pick a random index 

Если размеры таковы:

the dimension of concentration is 52x61x61 as concentration is c(x,y,time), that of x is 1x61 and 1x52 for y. @PetrH – s2015

это должно сделать трюк:

Это ваши данные, я просто сделать что-то:

x=linspace(0,1,61); 
y=linspace(0,1,52); 
con=20*rand(61,52); 

Теперь я нахожу все позиции в кон которые больше 10. Это приводит к логической матрице. Умножая его на случайную матрицу того же размера, я получаю матрицу со случайными значениями, где «con» больше 10, но везде равно нулю.

data_cbigger10=rand(size(con)).*(con>10); 

нахождением макс или мин, значение случайной точки выбрали:

for n=1:1:10 
    data_cbigger10=rand(size(con)).*(con>10); 

    [vals,xind]=max(data_cbigger10); 
    xind=squeeze(xind); 
    [vals,yind]=max(squeeze(vals)); 
    [~,time_ind]=max(squeeze(vals)); 

    yind=yind(time_ind); 
    xind=xind(yind,time_ind); 
    x_res(n)=x(xind) 
    y_res(n)=y(yind) 
    time_res(n)=time(time_ind) 
    con_res(n)=con(xind,yind,time_ind) 
    con(xind,yind,time_ind)=0; % setting the choosen point to zero, so it will not be choosen again. 
end 

Надежда это теперь работает для вас.

+0

@macro Это работает, но я получаю только 1D данные. Моя концентрация изменяется как с направлениями x, так и с, c (i, j), поэтому в конце мне нужны 2D-данные. Любая идея, как я могу генерировать то же самое для x (i) и y (j)? Благодаря! – s2015

+0

«randomPoint» должен быть вектором [1x3] с «x = randomPoint (1)», «y = randomPoint (2)» и «концентрация = randomPoint (3)». Попробуйте еще раз, исправив ошибку: «randomPoint = ** data_cbigger10 ** (round (size (data_cbigger10,2) * rand), :) ' –

+0

" randomPoint = ** data_cbigger10 ** (round (size (data_cbigger10,2) * rand), :) «Должен ли я удалить« ** »? В любом случае, когда я запускаю:« randomPoint = data_cbigger10 (round (size (data_cbigger10,2) * rand), :) «Я получаю следующую ошибку:« Индекс превышает размеры матрицы. "@marco – s2015

0

Если у вас есть концентрации для каждой точки (x,y) хранится в массиве concentration вы можете использовать find() и randsample() функции следующим образом:

conGT10 = find(concentration>10); % find where concentration is greater than 10 (gives you indices) 
randomPoints = randsample(conGT10,nn); % choose nn random numbers from those that satisfy the condition 
x1 = x(randomPoints);  % given the randomly drawn indices pull the corresponding numbers for x and y 
y1 = y(randomPoints); 

EDIT: выше предполагает, что массивы x , y и concentration: 1d и такой же длины. По-видимому, это не относится к вашей проблеме.

У вас есть сетка точек на плоскости (x,y), и вы измеряете концентрацию на этой сетке в разные периоды времени. Таким образом, длина x составляет nx, длина y составляет ny и размер concentration составляет nx по ny по nt. Для простоты предположим, что вы измеряете концентрацию только один раз, то есть nt=1, а концентрация составляет всего 2d.

Модифицированная версия моего предыдущего ответа затем будет следующим образом:

[rows,cols] = find(concentration>10); % find where concentration is greater than 10 (gives you indices) 
randomIndices = randsample(length(rows),nn); % choose nn random integers from 1 to n, where n is the number of observations that satisfy the condition 'concentration>10' 
randomX = x(rows(randomIndices)); 
randomY = y(cols(randomIndices)); 
+0

Я пробовал, но я получаю эту ошибку «Индекс превышает размеры матрицы.», Когда я пытаюсь запустить команды x1 и y1. Может быть, потому, что моя концентрация меняется как с x, так и с; c (i, j)? @PetrH – s2015

+0

@ s2015 Мое решение предполагает, что 'x',' y' и 'концентрация' являются 1d массивами одинаковой длины. Если это не так, я не могу полностью понять, что вы делаете. – PetrH

+0

размер концентрации 52x61x61, так как концентрация c (x, y, время), а для x равна 1x61 и 1x52 для y. @PetrH – s2015

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