2016-11-24 6 views
0

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

Также для моего задания я не могу использовать встроенные функции 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 

Как к: к: конец работы, я предполагаю, что это добавляет к, пока он не достигнет N. Благодаря

+0

Можете ли вы привести пример, например, путем формирования меньшего массива? –

+0

Задайте новый вопрос. Плохая практика заключается в том, чтобы добавить новый вопрос поверх старого. – rayryeng

ответ

0

OK

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

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

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

2

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

numbersthatareprime(primeindices)=1 
+2

Осторожно. 'isprime' является фактической функцией. https://www.mathworks.com/help/matlab/ref/isprime.html. Это затмит функцию этой переменной. Тем не менее, это правильный ответ, поэтому +1 для вас. – rayryeng

+0

V хороший момент. Недавно у меня был случай, когда я случайно перезаписал встроенные функции «линий», а затем вытаскивал волосы, когда окрашивание линий на следующем рисунке давало мне ошибки! –

+1

: D ... Я тебя слышу.Обходным путем является использование функции 'builtin', которая будет явно вызывать встроенную версию функции вместо перегруженной функции: https://www.mathworks.com/help/matlab/ref/builtin.html .. .. но он, конечно, минимизирует головные боли, если вы этого не сделаете. – rayryeng

-2

Вы действительно не нужна матрица. Просто список ценностей!

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 и т. д., creati ваш сиву.

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

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

+0

Не думаю, что это правильно. i: i: индексирование конца в цикле? 2: 2: конец, затем 3: 3: конец, затем 4: 4: конец и т. Д.? Что это делает? –

+0

Целью является определение бинарной матрицы, которая определяет, что является простым. – rayryeng

+1

Но вы повторяете все простые числа и их кратность! 2: 100 включает, например, 5, 7, 13 - все они будут установлены в 1. –

1

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

vec = zeros(1, N); 
vec(prim) = 1;