Создайте двухмерные антенные решетки и подмассивы доступа в Ruby

Тип данных float или Тип данных decimal должны использоваться для сумм в долларах?

ответ легок. Никогда плавания. НИКОГДА !

Плавания были согласно [1 110] IEEE 754 всегда двоичный файл, только новый стандарт , IEEE 754R определил десятичные форматы. Многие дробные двоичные части никогда не могут равняться точному десятичному представлению.
Любое двоичное число может быть записано как m/2^n (m, n положительные целые числа), любое десятичное число как m/(2^n*5^n).
, Поскольку двоичные файлы испытывают недостаток в начале factor 5, все двоичные числа могут быть точно представлены десятичными числами, но не наоборот.

0.3 = 3/(2^1 * 5^1) = 0.3

0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125]

          1/4         1/8         1/16          1/32

, Таким образом, Вы заканчиваете с числом или выше или ниже, чем данное десятичное число. Всегда.

, Почему это имеет значение? Округление.
Нормальное округление означает 0.. 4 вниз, 5.. 9. Таким образом, это делает вопрос, если результат или 0.049999999999.... или 0.0500000000... Можно знать, что это означает 5 центов, но компьютер не знает что и раунды 0.4999... вниз (неправильно) и 0.5000... (справа).
, Учитывая, что результат вычислений с плавающей точкой всегда содержат маленькие остаточные члены, решение является чистой удачей. Это становится безнадежным, если Вы хотите десятичную обработку раунда-к-ровному с двоичными числами.

Неубежденный? Вы настаиваете, что в Вашей системе учетной записи все совершенно в порядке?
равные Активы и пассивы? Хорошо, затем возьмите каждое из данных отформатированных чисел каждой записи, проанализируйте их и суммируйте их с независимой десятичной системой счисления! Сравните это с отформатированной суммой.
ой, существует что-то не так, не так ли?

Для того вычисления, экстремальной точности и точности требовался (мы использовали ПЛАВАНИЕ Oracle), таким образом, мы могли записать "миллиардную часть пенса", являющегося accured.

не помогает против этой ошибки. Поскольку все люди автоматически предполагают, что компьютерное право сумм, практически никто не проверяет независимо.

66
задан Andrew Grimm 6 January 2013 в 22:43
поделиться

5 ответов

Есть некоторые проблемы с двумерными массивами , как вы их реализуете.

a= [[1,2],[3,4]]
a[0][2]= 5 # works
a[2][0]= 6 # error

Хеш как массив

Я предпочитаю использовать Хэши для многомерных массивов

a= Hash.new
a[[1,2]]= 23
a[[5,6]]= 42

Это имеет то преимущество, что вам не нужно вручную создавать столбцы или строки. Вставка в хеши занимает почти O (1) , поэтому здесь нет недостатка, если ваш хэш не становится слишком большим.

Вы даже можете установить значение по умолчанию для всех неуказанных элементов

a= Hash.new(0)

Итак, теперь о том, как получить подмассивы

(3..5).to_a.product([2]).collect { |index| a[index] }
[2].product((3..5).to_a).collect { |index| a[index] }

(a..b) .to_a выполняется за O (n). Получение элемента из хэша составляет почти O (1), поэтому сбор выполняется почти за O (n). Нет способа сделать это быстрее, чем O (n), так как копирование n элементов всегда выполняется за O (n).

Хэши могут иметь проблемы, когда становятся слишком большими. Так что я бы дважды подумал о реализации многомерного массива , подобного этому, если бы я знал, что объем моих данных становится большим.

95
ответ дан 24 November 2019 в 14:52
поделиться
rows, cols = x,y  # your values
grid = Array.new(rows) { Array.new(cols) }

Что касается доступа к элементам, эта статья очень хороша для пошагового способа инкапсуляции массива так, как вы хотите:

Как создать массив ruby ​​

32
ответ дан 24 November 2019 в 14:52
поделиться

Вы не указали свою фактическую цель, но, возможно, это может помочь:

require 'matrix'  # bundled with Ruby
m = Matrix[
 [1, 2, 3],
 [4, 5, 6]
]

m.column(0) # ==> Vector[1, 4]

(и Vectors действует как массивы)

или, используя аналогичная нотация по вашему желанию:

m.minor(0..1, 2..2) # => Matrix[[3], [6]]
30
ответ дан 24 November 2019 в 14:52
поделиться

x.transpose [6] [3..8] или x [3..8] .map {| r | r [6]} даст то, что вы хотите.

Пример:

a = [ [1,  2,  3,  4,  5],
      [6,  7,  8,  9,  10],
      [11, 12, 13, 14, 15],
      [21, 22, 23, 24, 25]
    ]

#a[1..2][2]  -> [8,13]
puts a.transpose[2][1..2].inspect   # [8,13]
puts a[1..2].map {|r| r[2]}.inspect  # [8,13]
5
ответ дан 24 November 2019 в 14:52
поделиться

Вот пример 3D массива

class Array3D
   def initialize(d1,d2,d3)
    @data = Array.new(d1) { Array.new(d2) { Array.new(d3) } }
   end

  def [](x, y, z)
    @data[x][y][z]
  end

  def []=(x, y, z, value)
    @data[x][y][z] = value
  end
end

Вы можете получить доступ к подразделам каждого массива так же, как и к любому другому массиву Ruby. @data[0..2][3..5][8..10] = 0 etc

11
ответ дан 24 November 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: