Как перебирать матричные элементы Matlab

У меня есть задача создать фрагмент кода Matlab, который использует сито Эратосфена для поиска списка простых чисел до N. Я создал цикл, который находит не простые числа, а затем находит значение индекса их в списке от 2 до N. Как мне заставить мою программу принимать эти значения индекса поэлементно и устанавливать соответствующие позиции в моей нулевой матрице в единицу?

Также для моего задания я не могу использовать встроенные функции isprime.

Мой код до сих пор:

function [p,c] = sieve(N)

N = input('Please type an integer greater than 1: ');

a = ones(1,N); %Non-primes are set to 0

for k = 2:N

Как работает k:k:end, я предполагаю, что он добавляет k, пока не достигнет N. Спасибо.


person Kieran Marriott    schedule 24.11.2016    source источник
comment
Можете ли вы привести пример, сформировав меньший массив или около того?   -  person Avijit Dasgupta    schedule 24.11.2016
comment
Создайте новый вопрос. Здесь не рекомендуется добавлять новый вопрос поверх старого.   -  person rayryeng    schedule 26.11.2016


Ответы (4)


OK

Поскольку ОП все еще может быть сбит с толку, я просто дам новый ответ (не отличающийся от моего предыдущего неправильного ответа)

 x=zeros(100,1);
 for i=2:100; 
    x(2*i:i:end)=1; 
 end; find(~x)

Вам просто нужно перейти от 2*i, а не i....

person Sanjay Manohar    schedule 25.11.2016

Предполагая, что ваша матрица нулей называется «числа, которые являются простыми», а ваши простые индексы называются «простыми индексами»:

numbersthatareprime(primeindices)=1
person Hugh Nolan    schedule 24.11.2016
comment
Осторожный. isprime — это реальная функция. mathworks.com/help/matlab/ref/isprime.html. Это затмит функцию с этой переменной. Однако это правильный ответ, поэтому +1 вам. - person rayryeng; 24.11.2016
comment
V хороший момент - недавно у меня был случай, когда я случайно перезаписал встроенную функцию линий, а затем рвал на себе волосы, когда раскрашивание линий на следующем рисунке давало мне ошибки! - person Hugh Nolan; 24.11.2016
comment
:D... Я слышу тебя. Обходной путь — использовать функцию builtin, которая будет явно вызывать встроенную версию функции вместо перегруженной: mathworks.com/help/matlab/ref/builtin.html.... но это, конечно, минимизирует головную боль, если вы все равно этого не сделаете. - person rayryeng; 24.11.2016
comment
В моем случае я не понимал, что у меня есть, пока не посмотрел на самый верх и самый низ моего сценария. lines кажется естественной переменной для использования при извлечении текстового файла построчно... Не делайте этого! - person Hugh Nolan; 24.11.2016

Это просто вопрос использования вашего массива для индексации вашего вектора. Таким образом, создайте вектор всех нулей длиной N, а затем, предположив, что у вас есть список простых чисел до N, который называется prim, просто выполните:

vec = zeros(1, N);
vec(prim) = 1;
person rayryeng    schedule 24.11.2016

Матрица точно не нужна. Просто список значений!

X=zeros(10000,1);
for i=2:100
   X(i:i:end) = 1
end

Здесь индексация i:i:end означает

  • [2,4,6,8,...] когда i==2
  • [3,6,9,...] когда i==3
  • так далее

Таким образом, он устанавливает все кратные 2, затем все кратные 3 и т. д., создавая ваш seive.

Обратите внимание, что вам нужно подняться только до sqrt(N).

Тогда вы можете просто сделать find(X), чтобы получить простые числа!

person Sanjay Manohar    schedule 24.11.2016
comment
Я не думаю, что это правильно. i:i:завершить индексацию в цикле? 2:2:конец, затем 3:3:конец, затем 4:4:конец и т. д.? Что это делает? - person Hugh Nolan; 24.11.2016
comment
Цель состоит в том, чтобы определить бинарную матрицу, которая определяет, что является простым. - person rayryeng; 24.11.2016
comment
Но вы перебираете все простые числа и их кратные числа! 2:100 включает, например. 5, 7, 13 - все они будут установлены в 1. - person Hugh Nolan; 24.11.2016
comment
Это определяет двоичный массив, который определяет, что является простым. (т.е. нули) - person Sanjay Manohar; 24.11.2016
comment
Ах да, ты прав @HughNolan! Я оставлю этот неправильный ответ здесь, поскольку он иллюстрирует часть того, что придется делать ОП... - person Sanjay Manohar; 24.11.2016
comment
На выходе вы получите вектор всех единиц. - person rayryeng; 24.11.2016
comment
Конечно, это приведет к тому, что 2 будет считаться не простым, поскольку оно будет помечено как 1. Что именно делает команда end? - person Kieran Marriott; 26.11.2016
comment
Поскольку принятого ответа до сих пор нет, я хотел бы отметить, что изменение начального индекса X(i: на X(2*i: делает то, что требуется, и я добавил еще один ответ с этой модификацией. Самое главное, я думаю, это то, что хотел знать ОП. - person Sanjay Manohar; 27.11.2016