Чтобы рассчитать мощность матрицы, вы можете использовать пакет expm
или пакет matrixcalc
:
A <- toeplitz(c(1,2,3)) # a square matrix
A
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 2 1 2
# [3,] 3 2 1
library(expm)
A %^% 2
# [,1] [,2] [,3]
# [1,] 14 10 10
# [2,] 10 9 10
# [3,] 10 10 14
library(matrixcalc)
matrix.power(A, 2)
# [,1] [,2] [,3]
# [1,] 14 10 10
# [2,] 10 9 10
# [3,] 10 10 14
Для графика:
powers <- 0:8
Apowers <- lapply(powers, function(k) A %^% k)
norms <- sapply(Apowers, norm, type = "1")
plot(powers, norms)
Если вы посмотрите, как Microsoft определяет свои дескрипторы winapi (winnt.h), то на самом деле это выглядит так:
struct HWND__ { int unused; }; typedef struct HWND__ *HWND
фактически у них есть макрос для этого:
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
, так что ... это похоже, что это обычная практика. К сожалению, я не могу сделать еще одно предложение, кроме этого, которое вы уже упоминается, но я надеюсь, что это все равно поможет.
Использовать непрозрачную структуру. Это хорошая идея во многих случаях при определении интерфейса к библиотеке на C: это улучшает модульность, скрывает ненужные детали
. Как сказал JamieH, вы получаете непрозрачную структуру, объявляя - но не определяя - структуру. Совершенно допустимо иметь и передавать указатели на непрозрачную структуру в функции библиотеки в качестве аргументов и возвращать их как значения. Однако пользователи библиотеки не могут создавать или изменять объекты непрозрачной структуры, поскольку ее размер и содержимое неизвестны.
Стандартная библиотека C и многие другие уже используют этот подход, поэтому он должен быть знаком. Канонический пример - использование FILE *
: fopen ()
создает и инициализирует структуру и возвращает указатель на нее,
I think you can just declare, but not define, the source structures:
struct MyType1;
typedef struct MyType1* MyType1Handle;