Diberikan satu set elemen (dinyatakan dalam vektor baris Vi) saya mengekstrak nilai maksimum ke vektor (baris) lain (bernama 'ki') menggunakan [ki] = find(Vi==max(max(Vi))). Saya mengatakan nilais karena banyak angka yang berulang. Saya harus memilih secara acak di antara semua nilai yang diulang dan mengetahui kolom yang dipilih. Untuk itu saya membuat kode berikut.

ri=rand(1)

for j=1:length(ki)
  if    ((j-1)/length(ki)<ri<=j/length(ki))
    mi=ki(j)
  endif;
endfor  

if (ri==0)
  mi=ki(1)
endif

Masalahnya adalah selalu memberi saya mi=ki(last 'j' of the for cycle) (yang dalam hal ini adalah mi=ki(length(ki))). Mengapa?

-2
Gato Mazzei 3 September 2016, 20:28
Hei mengapa begitu banyak suara turun ... :/
 – 
Gato Mazzei
3 September 2016, 22:06
Hanya menunjukkan fungsi find tidak memberi Anda nilai maksimum tetapi indeks mereka. Haruskah ki Anda menjadi ki = Vi(Vi == max(Vi(:)));?
 – 
Tasos Papastylianou
3 September 2016, 22:59
Tidak. Nilai tidak penting untuk apa yang ingin saya bangun. jika sudah siap akan menarik bagi orang untuk melihatnya, karena ini adalah model matematika dasar dari perilaku sosial kupu-kupu. Apakah ada tempat di sini untuk hanya memposting kode dan mengundang orang untuk menggunakannya sesuka mereka?
 – 
Gato Mazzei
4 September 2016, 00:22
StackOverflow sebagian besar merupakan situs Tanya Jawab, jadi tidak akan terlalu relevan dengan situs ini. Jika ini terkait dengan universitas, maka saya mendorong Anda untuk memulai blog akademis dan memposting ini sebagai salah satu artikel Anda. Blog semakin menjadi alat yang sangat berguna bagi akademisi akhir-akhir ini. Juga, Anda dapat menawarkan proyek Anda sebagai proyek sumber terbuka di github, dll.
 – 
Tasos Papastylianou
4 September 2016, 00:27
Untuk nilai vs indeks, cukup adil, memang sepertinya Anda mengejar indeks daripada nilai dari cara Anda mengulanginya ... Saya hanya berkomentar karena Anda menyebutkan kata "nilai" , hanya untuk memastikan.
 – 
Tasos Papastylianou
4 September 2016, 00:28

1 menjawab

Jawaban Terbaik

Ekspresi ((j-1)/length(ki)<ri<=j/length(ki)) tidak melakukan apa yang Anda pikirkan. Matlab / Oktaf tidak mendukung "rantai" operasi. Tes logis Anda seharusnya:

((j-1)/length(ki)) < ri && ri <= (j/length(ki))

Alih-alih, yang Anda lakukan adalah menghitung ((j-1)/length(ki)) < ri terlebih dahulu, yang akan memberi Anda 0 atau 1, dan Anda kemudian memeriksa apakah 0 atau 1 lebih kecil atau sama dengan (j/length(ki))

0
Tasos Papastylianou 3 September 2016, 22:45
Terima kasih! Anda memiliki dan braket tambahan. Kode yang benar adalah ((j-1)/panjang(ki) < ri && (ri <= j/panjang(ki)))
 – 
Gato Mazzei
3 September 2016, 22:20
Saya melihat Anda adalah pengguna baru. Selamat datang di komunitas. Jika jawaban ini menyelesaikan masalah Anda, harap tandai sebagai diterima; juga upvote semua jawaban yang Anda rasa berguna/menarik (termasuk, yang diterima). Juga, saya menduga alasan Anda memiliki downvotes adalah karena salah satu permintaan utama kepada pengguna yang memposting pertanyaan di sini adalah untuk memberikan contoh kerja minimal (kadang-kadang juga dikenal sebagai mcve) sehingga orang dapat mencobanya di mesin mereka. Jauh lebih sulit untuk membantu ketika Anda tidak dapat menjalankan dan men-debug sesuatu di layar, jadi orang-orang menganggap ini sebagai pertanyaan buruk.
 – 
Tasos Papastylianou
3 September 2016, 22:51
Juga, saya menduga judul pertanyaan Anda memicu reaksi spontan terhadap orang-orang yang membenci pertanyaan "mengapa kode saya tidak berfungsi" (sebagai lawan dari pertanyaan spesifik). Saya akan mengedit judul Anda dan membuatnya sedikit lebih enak jika Anda tidak keberatan.
 – 
Tasos Papastylianou
3 September 2016, 22:53